aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-core/src
diff options
context:
space:
mode:
Diffstat (limited to 'sonar-core/src')
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCalculator.java59
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCharacteristic.java74
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtConverter.java1
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtManager.java116
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java89
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModel.java130
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java103
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelService.java90
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java96
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java11
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java239
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/WorkUnit.java68
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDao.java45
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java61
-rw-r--r--sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicMapper.java2
-rw-r--r--sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml11
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtCalculatorTest.java122
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtConverterTest.java1
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtManagerTest.java320
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java108
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java111
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest.java2
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelTest.java97
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRequirementTest.java110
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java97
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java85
-rw-r--r--sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicMapperTest.java129
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin-result.xml39
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin.xml30
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_default_model_on_first_execution-result.xml16
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_model_with_requirements_from_plugin_on_first_execution-result.xml34
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules-result.xml40
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules.xml38
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/empty.xml2
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model-result.xml30
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model.xml30
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model-with-addtionnal-characteristic.xml34
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model-adding-unknown-characteristic.xml80
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model.xml62
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it-result.xml46
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it.xml31
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/reset_model.xml13
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/csharp-model.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/java-model.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/import_characteristics.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model.xml)10
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml41
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_constant_per_file.xml27
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_linear_with_threshold.xml40
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear.xml26
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear_with_offset.xml36
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml11
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml25
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable-result.xml7
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable.xml7
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_characteristic-result.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_characteristic-result.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_requirement-result.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_requirement-result.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic-result.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic-result.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement-result.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement-result.xml)0
-rw-r--r--sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement.xml (renamed from sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement.xml)0
60 files changed, 1275 insertions, 1857 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCalculator.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCalculator.java
deleted file mode 100644
index 3c6a572f5f7..00000000000
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCalculator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import com.google.common.base.Objects;
-import org.sonar.api.BatchExtension;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.internal.WorkDayDuration;
-
-/**
- * Computes the remediation cost based on the quality and analysis models.
- */
-public class TechnicalDebtCalculator implements BatchExtension {
-
- private final TechnicalDebtConverter converter;
- private TechnicalDebtModel technicalDebtModel;
-
- public TechnicalDebtCalculator(TechnicalDebtModel technicalDebtModel, TechnicalDebtConverter converter) {
- this.technicalDebtModel = technicalDebtModel;
- this.converter = converter;
- }
-
- public WorkDayDuration calculTechnicalDebt(Issue issue) {
- TechnicalDebtRequirement requirement = technicalDebtModel.getRequirementByRule(issue.ruleKey().repository(), issue.ruleKey().rule());
- if (requirement != null) {
- return converter.fromMinutes(calculTechnicalDebt(requirement, issue));
- }
- return null;
- }
-
- private long calculTechnicalDebt(TechnicalDebtRequirement requirement, Issue issue) {
- long effortToFix = Objects.firstNonNull(issue.effortToFix(), 1L).longValue();
-
- WorkUnit factorUnit = requirement.getRemediationFactor();
- long factor = factorUnit != null ? converter.toMinutes(factorUnit) : 0L;
-
- WorkUnit offsetUnit = requirement.getOffset();
- long offset = offsetUnit != null ? converter.toMinutes(offsetUnit) : 0L;
-
- return effortToFix * factor + offset;
- }
-}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCharacteristic.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCharacteristic.java
deleted file mode 100644
index 0b91fbb4ec6..00000000000
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtCharacteristic.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import com.google.common.collect.Lists;
-
-import javax.annotation.Nullable;
-
-import java.util.List;
-
-public final class TechnicalDebtCharacteristic {
-
- private String key;
- private org.sonar.api.qualitymodel.Characteristic characteristic;
- private TechnicalDebtCharacteristic parent = null;
- private List<TechnicalDebtCharacteristic> subCharacteristics = Lists.newArrayList();
- private List<TechnicalDebtRequirement> requirements = Lists.newArrayList();
-
- public TechnicalDebtCharacteristic(org.sonar.api.qualitymodel.Characteristic c) {
- this(c, null);
- }
-
- public TechnicalDebtCharacteristic(org.sonar.api.qualitymodel.Characteristic c, @Nullable TechnicalDebtCharacteristic parent) {
- this.characteristic = c;
- this.key = c.getKey();
- this.parent = parent;
- for (org.sonar.api.qualitymodel.Characteristic subc : c.getChildren()) {
- if (subc.getEnabled()) {
- if (subc.getRule() != null) {
- requirements.add(new TechnicalDebtRequirement(subc, this));
- } else {
- subCharacteristics.add(new TechnicalDebtCharacteristic(subc, this));
- }
- }
- }
- }
-
- public String getKey() {
- return key;
- }
-
- public List<TechnicalDebtCharacteristic> getSubCharacteristics() {
- return subCharacteristics;
- }
-
- public TechnicalDebtCharacteristic getParent() {
- return parent;
- }
-
- public List<TechnicalDebtRequirement> getRequirements() {
- return requirements;
- }
-
- public org.sonar.api.qualitymodel.Characteristic toCharacteristic() {
- return characteristic;
- }
-}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtConverter.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtConverter.java
index bc7226911bb..80bdc74f876 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtConverter.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtConverter.java
@@ -24,6 +24,7 @@ import org.sonar.api.BatchComponent;
import org.sonar.api.ServerComponent;
import org.sonar.api.config.Settings;
import org.sonar.api.issue.internal.WorkDayDuration;
+import org.sonar.api.technicaldebt.WorkUnit;
import javax.annotation.Nullable;
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtManager.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtManager.java
index 76f854c5b36..a545abf444c 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtManager.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtManager.java
@@ -17,18 +17,18 @@
* 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.core.technicaldebt;
import org.apache.commons.io.IOUtils;
+import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.ServerExtension;
-import org.sonar.api.database.DatabaseSession;
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.qualitymodel.ModelFinder;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
import org.sonar.api.utils.ValidationMessages;
-import org.sonar.jpa.session.DatabaseSessionFactory;
+import org.sonar.core.persistence.MyBatis;
import java.io.Reader;
import java.util.Collection;
@@ -40,69 +40,87 @@ public class TechnicalDebtManager implements ServerExtension {
private static final Logger LOG = LoggerFactory.getLogger(TechnicalDebtManager.class);
- private static final int REQUIREMENT_LEVEL = 3;
-
- private DatabaseSessionFactory sessionFactory;
- private ModelFinder modelFinder;
- private TechnicalDebtModelRepository languageModelFinder;
- private TechnicalDebtXMLImporter importer;
+ private final MyBatis mybatis;
+ private final TechnicalDebtModelService service;
+ private final TechnicalDebtModelFinder modelFinder;
+ private final TechnicalDebtModelRepository languageModelFinder;
+ private final TechnicalDebtXMLImporter importer;
- public TechnicalDebtManager(DatabaseSessionFactory sessionFactory, ModelFinder modelFinder,
+ public TechnicalDebtManager(MyBatis mybatis, TechnicalDebtModelService service, TechnicalDebtModelFinder modelFinder,
TechnicalDebtModelRepository modelRepository, TechnicalDebtXMLImporter importer) {
- this.sessionFactory = sessionFactory;
+ this.mybatis = mybatis;
+ this.service = service;
this.modelFinder = modelFinder;
this.languageModelFinder = modelRepository;
this.importer = importer;
}
- public Model initAndMergePlugins(ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
- DatabaseSession session = sessionFactory.getSession();
+ public TechnicalDebtModel initAndMergePlugins(ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
+ SqlSession session = mybatis.openSession();
- Model model = initAndMergePlugins(messages, rulesCache, session);
-
- session.commit();
+ TechnicalDebtModel model = null;
+ try {
+ model = initAndMergePlugins(messages, rulesCache, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
return model;
}
- public Model initAndMergePlugins(ValidationMessages messages, TechnicalDebtRuleCache rulesCache, DatabaseSession session) {
- disableRequirementsOnRemovedRules(rulesCache);
-
- Model defaultModel = loadModelFromXml(TechnicalDebtModelRepository.DEFAULT_MODEL, messages, rulesCache);
- Model model = loadOrCreateModelFromDb(defaultModel, messages, rulesCache);
- mergePlugins(model, defaultModel, messages, rulesCache);
+ public TechnicalDebtModel initAndMergePlugins(ValidationMessages messages, TechnicalDebtRuleCache rulesCache, SqlSession session) {
+ TechnicalDebtModel defaultModel = loadModelFromXml(TechnicalDebtModelRepository.DEFAULT_MODEL, messages, rulesCache);
+ TechnicalDebtModel model = loadOrCreateModelFromDb(defaultModel, messages, session);
+ disableRequirementsOnRemovedRules(model, rulesCache, session);
+ mergePlugins(model, defaultModel, messages, rulesCache, session);
messages.log(LOG);
- session.save(model);
+
return model;
}
- public Model loadModel() {
- return modelFinder.findByName(TechnicalDebtModel.MODEL_NAME);
+ public TechnicalDebtModel loadModel() {
+ return modelFinder.findAll();
}
- private Model loadOrCreateModelFromDb(Model defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
- Model model = loadModel();
- if (model == null) {
- model = Model.createByName(TechnicalDebtModel.MODEL_NAME);
+ private TechnicalDebtModel loadOrCreateModelFromDb(TechnicalDebtModel defaultModel, ValidationMessages messages, SqlSession session) {
+ TechnicalDebtModel model = loadModel();
+ if (model.isEmpty()) {
+ createTechnicalDebtModel(defaultModel, session);
+ return defaultModel;
}
- mergePlugin(defaultModel, model, messages, rulesCache);
return model;
}
- private void mergePlugins(Model existingModel, Model defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
+ private void createTechnicalDebtModel(TechnicalDebtModel defaultModel, SqlSession session) {
+ for (Characteristic rootCharacteristic : defaultModel.rootCharacteristics()) {
+ service.create(rootCharacteristic, session);
+ for (Characteristic characteristic : rootCharacteristic.children()) {
+ service.create(characteristic, session);
+ }
+ }
+ }
+
+ private void mergePlugins(TechnicalDebtModel existingModel, TechnicalDebtModel defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache, SqlSession session) {
for (String pluginKey : getContributingPluginListWithoutSqale()) {
- Model pluginModel = loadModelFromXml(pluginKey, messages, rulesCache);
+ TechnicalDebtModel pluginModel = loadModelFromXml(pluginKey, messages, rulesCache);
checkPluginDoNotAddNewCharacteristic(pluginModel, defaultModel);
- mergePlugin(pluginModel, existingModel, messages, rulesCache);
+ mergePlugin(pluginModel, existingModel, messages, rulesCache, session);
}
}
- public void mergePlugin(Model pluginModel, Model existingModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
+ public void mergePlugin(TechnicalDebtModel pluginModel, TechnicalDebtModel existingModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache, SqlSession session) {
if (!messages.hasErrors()) {
- new TechnicalDebtMergeModel(existingModel).mergeWith(pluginModel, messages, rulesCache);
+ List<Requirement> existingRequirements = existingModel.requirements();
+ for (Requirement pluginRequirement : pluginModel.requirements()) {
+ if (!existingRequirements.contains(pluginRequirement)) {
+ Characteristic characteristic = existingModel.characteristicByKey(pluginRequirement.characteristic().key());
+ service.create(pluginRequirement, characteristic, rulesCache, session);
+ }
+ }
}
}
- public Model loadModelFromXml(String pluginKey, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
+ public TechnicalDebtModel loadModelFromXml(String pluginKey, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) {
Reader xmlFileReader = null;
try {
xmlFileReader = languageModelFinder.createReaderForXMLFile(pluginKey);
@@ -112,22 +130,20 @@ public class TechnicalDebtManager implements ServerExtension {
}
}
- private void checkPluginDoNotAddNewCharacteristic(Model pluginModel, Model defaultModel) {
- List<Characteristic> defaultCharacteristics = defaultModel.getCharacteristics();
- for (Characteristic characteristic : pluginModel.getCharacteristics()) {
- if (!characteristic.hasRule() && !defaultCharacteristics.contains(characteristic)) {
- throw new IllegalArgumentException("The characteristic : " + characteristic.getKey() + " cannot be used as it's not available in default ones.");
+ private void checkPluginDoNotAddNewCharacteristic(TechnicalDebtModel pluginModel, TechnicalDebtModel defaultModel) {
+ List<Characteristic> characteristics = defaultModel.characteristics();
+ for (Characteristic characteristic : pluginModel.characteristics()) {
+ if (!characteristics.contains(characteristic)) {
+ throw new IllegalArgumentException("The characteristic : " + characteristic.key() + " cannot be used as it's not available in default characteristics.");
}
}
}
- private void disableRequirementsOnRemovedRules(TechnicalDebtRuleCache rulesCache) {
- Model existingModel = modelFinder.findByName(TechnicalDebtModel.MODEL_NAME);
- if (existingModel != null) {
- for (Characteristic requirement : existingModel.getCharacteristicsByDepth(REQUIREMENT_LEVEL)) {
- if (!rulesCache.exists(requirement.getRule())) {
- existingModel.removeCharacteristic(requirement);
- }
+ private void disableRequirementsOnRemovedRules(TechnicalDebtModel model, TechnicalDebtRuleCache rulesCache, SqlSession session) {
+ for (Requirement requirement : model.requirements()) {
+ if (!rulesCache.exists(requirement.ruleKey())) {
+ requirement.characteristic().removeRequirement(requirement);
+ service.disable(requirement, session);
}
}
}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java
deleted file mode 100644
index 9acfe27247e..00000000000
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.CharacteristicProperty;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.utils.ValidationMessages;
-
-public class TechnicalDebtMergeModel {
-
- private Model model;
-
- public TechnicalDebtMergeModel(Model model) {
- this.model = model;
- }
-
- public void mergeWith(Model with, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) {
- for (Characteristic characteristic : with.getCharacteristics()) {
- if (isRequirement(characteristic)) {
- mergeRequirement(characteristic, messages, technicalDebtRuleCache);
- } else {
- mergeCharacteristic(characteristic, messages);
- }
- }
- }
-
- private Characteristic mergeCharacteristic(Characteristic characteristic, ValidationMessages messages) {
- Characteristic existingCharacteristic = model.getCharacteristicByKey(characteristic.getKey());
- if (existingCharacteristic == null) {
- existingCharacteristic = model.addCharacteristic(clone(characteristic));
- if (!characteristic.getParents().isEmpty()) {
- Characteristic parentTargetCharacteristic = mergeCharacteristic(characteristic.getParents().get(0), messages);
- parentTargetCharacteristic.addChild(existingCharacteristic);
- }
- }
- return existingCharacteristic;
- }
-
- private void mergeRequirement(Characteristic requirement, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) {
- Characteristic targetRequirement = model.getCharacteristicByRule(requirement.getRule());
- if (targetRequirement == null && !requirement.getParents().isEmpty()) {
- Rule rule = technicalDebtRuleCache.getRule(requirement.getRule().getRepositoryKey(), requirement.getRule().getKey());
- if (rule == null) {
- messages.addWarningText("The rule " + requirement.getRule() + " does not exist.");
-
- } else {
- Characteristic parent = mergeCharacteristic(requirement.getParents().get(0), messages);
- requirement = model.addCharacteristic(clone(requirement));
- requirement.setRule(rule);
- parent.addChild(requirement);
- }
- }
- }
-
- private boolean isRequirement(Characteristic characteristic) {
- return characteristic.hasRule();
- }
-
- private Characteristic clone(Characteristic c) {
- Characteristic clone = Characteristic.create();
- clone.setRule(c.getRule());
- clone.setDescription(c.getDescription());
- clone.setKey(c.getKey());
- clone.setName(c.getName(), false);
- for (CharacteristicProperty property : c.getProperties()) {
- clone.setProperty(property.getKey(), property.getTextValue()).setValue(property.getValue());
- }
- return clone;
- }
-}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModel.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModel.java
index 9a1516efc6b..1cbaddfe64c 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModel.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModel.java
@@ -17,95 +17,107 @@
* 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.core.technicaldebt;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.BatchComponent;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.qualitymodel.ModelFinder;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.utils.SonarException;
-import org.sonar.api.utils.TimeProfiler;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
import javax.annotation.CheckForNull;
import java.util.Collection;
import java.util.List;
-import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Maps.newHashMap;
-/**
- * This class contains characteristics and requirement of the technical debt mode.
- * It should be used only on batch side, because on server side the model can be updated by the SQALE plugin
- */
-public class TechnicalDebtModel implements BatchComponent {
+public class TechnicalDebtModel {
- private static final Logger LOGGER = LoggerFactory.getLogger(TechnicalDebtModel.class);
+ private Collection<Characteristic> rootCharacteristics;
- public static final String MODEL_NAME = "SQALE";
+ public TechnicalDebtModel() {
+ rootCharacteristics = newArrayList();
+ }
- private List<TechnicalDebtCharacteristic> characteristics = newArrayList();
- private Map<Rule, TechnicalDebtRequirement> requirementsByRule = newHashMap();
+ public TechnicalDebtModel addRootCharacteristic(Characteristic characteristic) {
+ rootCharacteristics.add(characteristic);
+ return this;
+ }
- public TechnicalDebtModel(ModelFinder modelFinder) {
- TimeProfiler profiler = new TimeProfiler(LOGGER).start("Loading technical debt model");
- Model model = modelFinder.findByName(MODEL_NAME);
- if (model == null) {
- throw new SonarException("Can not find the model in database: " + MODEL_NAME);
- }
- init(model);
- profiler.stop();
+ public List<Characteristic> rootCharacteristics() {
+ return newArrayList(Iterables.filter(rootCharacteristics, new Predicate<Characteristic>() {
+ @Override
+ public boolean apply(Characteristic input) {
+ return input.isRoot();
+ }
+ }));
}
- /**
- * For unit tests
- */
- private TechnicalDebtModel(Model model) {
- init(model);
+ @CheckForNull
+ public Characteristic characteristicByKey(final String key) {
+ return Iterables.find(characteristics(), new Predicate<Characteristic>() {
+ @Override
+ public boolean apply(Characteristic input) {
+ return input.key().equals(key);
+ }
+ }, null);
}
- /**
- * For unit tests
- */
- public static TechnicalDebtModel create(Model model) {
- return new TechnicalDebtModel(model);
+ @CheckForNull
+ public Characteristic characteristicById(final Integer id){
+ return Iterables.find(characteristics(), new Predicate<Characteristic>() {
+ @Override
+ public boolean apply(Characteristic input) {
+ return input.id().equals(id);
+ }
+ }, null);
}
- private void init(Model model) {
- for (org.sonar.api.qualitymodel.Characteristic characteristic : model.getRootCharacteristics()) {
- if (characteristic.getEnabled()) {
- TechnicalDebtCharacteristic sc = new TechnicalDebtCharacteristic(characteristic);
- characteristics.add(sc);
- registerRequirements(sc);
+ @CheckForNull
+ public Requirement requirementsByRule(final RuleKey ruleKey) {
+ return Iterables.find(requirements(), new Predicate<Requirement>() {
+ @Override
+ public boolean apply(Requirement input) {
+ return input.ruleKey().equals(ruleKey);
}
- }
+ }, null);
}
- private void registerRequirements(TechnicalDebtCharacteristic c) {
- for (TechnicalDebtRequirement requirement : c.getRequirements()) {
+ @CheckForNull
+ public Requirement requirementsById(final Integer id){
+ return Iterables.find(requirements(), new Predicate<Requirement>() {
+ @Override
+ public boolean apply(Requirement input) {
+ return input.id().equals(id);
+ }
+ }, null);
+ }
- if (requirement.getRule() != null) {
- requirementsByRule.put(requirement.getRule(), requirement);
+ public List<Characteristic> characteristics() {
+ List<Characteristic> flatCharacteristics = newArrayList();
+ for (Characteristic rootCharacteristic : rootCharacteristics) {
+ flatCharacteristics.add(rootCharacteristic);
+ for (Characteristic characteristic : rootCharacteristic.children()) {
+ flatCharacteristics.add(characteristic);
}
}
- for (TechnicalDebtCharacteristic subCharacteristic : c.getSubCharacteristics()) {
- registerRequirements(subCharacteristic);
- }
+ return flatCharacteristics;
}
- public List<TechnicalDebtCharacteristic> getCharacteristics() {
- return characteristics;
+ public List<Requirement> requirements() {
+ List<Requirement> allRequirements = newArrayList();
+ for (Characteristic characteristic : characteristics()) {
+ for (Requirement requirement : characteristic.requirements()) {
+ allRequirements.add(requirement);
+ }
+ }
+ return allRequirements;
}
- public Collection<TechnicalDebtRequirement> getAllRequirements() {
- return requirementsByRule.values();
+ public boolean isEmpty(){
+ return rootCharacteristics.isEmpty();
}
- @CheckForNull
- public TechnicalDebtRequirement getRequirementByRule(String repositoryKey, String key) {
- return requirementsByRule.get(Rule.create().setUniqueKey(repositoryKey, key));
- }
}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java
new file mode 100644
index 00000000000..67ff25f7edf
--- /dev/null
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java
@@ -0,0 +1,103 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.core.technicaldebt;
+
+import org.sonar.api.BatchComponent;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.core.rule.DefaultRuleFinder;
+import org.sonar.core.technicaldebt.db.CharacteristicDao;
+import org.sonar.core.technicaldebt.db.CharacteristicDto;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+
+public class TechnicalDebtModelFinder implements ServerComponent, BatchComponent {
+
+ private final CharacteristicDao dao;
+ private final DefaultRuleFinder ruleFinder;
+
+ public TechnicalDebtModelFinder(CharacteristicDao dao, DefaultRuleFinder ruleFinder) {
+ this.dao = dao;
+ this.ruleFinder = ruleFinder;
+ }
+
+ public TechnicalDebtModel findAll() {
+ TechnicalDebtModel model = new TechnicalDebtModel();
+ List<CharacteristicDto> dtos = dao.selectEnabledCharacteristics();
+ Map<Integer, Characteristic> characteristicsById = newHashMap();
+ List<Integer> ruleIds = newArrayList();
+
+ // Root characteristics
+ for (CharacteristicDto dto : dtos) {
+ if (dto.getParentId() == null) {
+ Characteristic rootCharacteristic = dto.toCharacteristic(null);
+ model.addRootCharacteristic(rootCharacteristic);
+ characteristicsById.put(dto.getId(), rootCharacteristic);
+ }
+ }
+
+ // Characteristics
+ for (CharacteristicDto dto : dtos) {
+ if (dto.getParentId() != null && dto.getRuleId() == null) {
+ Characteristic parent = characteristicsById.get(dto.getParentId());
+ Characteristic characteristic = dto.toCharacteristic(parent);
+ characteristicsById.put(dto.getId(), characteristic);
+ }
+ }
+
+ for (CharacteristicDto dto : dtos) {
+ if (dto.getRuleId() != null) {
+ ruleIds.add(dto.getRuleId());
+ }
+ }
+
+ Map<Integer, Rule> rulesById = findRules(ruleIds);
+ // Requirements
+ for (CharacteristicDto dto : dtos) {
+ Integer ruleId = dto.getRuleId();
+ if (ruleId != null) {
+ Characteristic characteristic = characteristicsById.get(dto.getParentId());
+ Rule rule = rulesById.get(ruleId);
+ RuleKey ruleKey = RuleKey.of(rule.getRepositoryKey(), rule.getKey());
+ dto.toRequirement(ruleKey, characteristic);
+ }
+ }
+
+ return model;
+ }
+
+ private Map<Integer, Rule> findRules(List<Integer> ruleIds) {
+ Collection<Rule> rules = ruleFinder.findByIds(ruleIds);
+ Map<Integer, Rule> rulesById = newHashMap();
+ for (Rule rule : rules) {
+ rulesById.put(rule.getId(), rule);
+ }
+ return rulesById;
+ }
+
+}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelService.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelService.java
new file mode 100644
index 00000000000..7537cd97d57
--- /dev/null
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelService.java
@@ -0,0 +1,90 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.core.technicaldebt;
+
+import org.apache.ibatis.session.SqlSession;
+import org.sonar.api.ServerExtension;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.technicaldebt.db.CharacteristicDao;
+import org.sonar.core.technicaldebt.db.CharacteristicDto;
+
+public class TechnicalDebtModelService implements ServerExtension {
+
+ private final MyBatis mybatis;
+ private final CharacteristicDao dao;
+
+ public TechnicalDebtModelService(MyBatis mybatis, CharacteristicDao dao) {
+ this.mybatis = mybatis;
+ this.dao = dao;
+ }
+
+ public void create(Characteristic characteristic, SqlSession session) {
+ CharacteristicDto characteristicDto = CharacteristicDto.toDto(characteristic);
+ dao.insert(characteristicDto, session);
+ characteristic.setId(characteristicDto.getId());
+ }
+
+ public void create(Characteristic characteristic) {
+ SqlSession session = mybatis.openSession();
+ try {
+ create(characteristic, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ public void create(Requirement requirement, Characteristic characteristic, TechnicalDebtRuleCache ruleCache, SqlSession session) {
+ Rule rule = ruleCache.getByRuleKey(requirement.ruleKey());
+ requirement.setCharacteristic(characteristic);
+ CharacteristicDto requirementDto = CharacteristicDto.toDto(requirement, rule.getId());
+ dao.insert(requirementDto, session);
+ requirement.setId(requirementDto.getId());
+ }
+
+ public void create(Requirement requirement, Characteristic characteristic, TechnicalDebtRuleCache ruleCache) {
+ SqlSession session = mybatis.openSession();
+ try {
+ create(requirement, characteristic, ruleCache, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ public void disable(Requirement requirement, SqlSession session) {
+ dao.disable(requirement.id(), session);
+ }
+
+ public void disable(Requirement requirement) {
+ SqlSession session = mybatis.openSession();
+ try {
+ disable(requirement, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java
deleted file mode 100644
index df07400c8d6..00000000000
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.rules.Rule;
-
-import javax.annotation.CheckForNull;
-
-public class TechnicalDebtRequirement {
-
- public static final String PROPERTY_REMEDIATION_FUNCTION = "remediationFunction";
- public static final String PROPERTY_REMEDIATION_FACTOR = "remediationFactor";
- public static final String PROPERTY_OFFSET = "offset";
-
- public static final String FUNCTION_LINEAR = "linear";
- public static final String FUNCTION_LINEAR_WITH_OFFSET = "linear_offset";
- public static final String FUNCTION_CONSTANT_PER_ISSUE = "constant_issue";
-
- private Rule rule;
- private TechnicalDebtCharacteristic parent;
- private org.sonar.api.qualitymodel.Characteristic characteristic;
- private String function;
- private WorkUnit factor;
- private WorkUnit offset;
-
- public TechnicalDebtRequirement(Characteristic requirement, TechnicalDebtCharacteristic parent) {
- this.characteristic = requirement;
- this.rule = requirement.getRule();
- this.parent = parent;
-
- initFunction();
- initFactor();
- initOffset();
- }
-
- private void initFunction() {
- function = characteristic.getPropertyTextValue(PROPERTY_REMEDIATION_FUNCTION, FUNCTION_LINEAR);
- }
-
- private void initFactor() {
- if (FUNCTION_LINEAR.equals(function) || FUNCTION_LINEAR_WITH_OFFSET.equals(function)) {
- factor = WorkUnit.create(characteristic.getPropertyValue(PROPERTY_REMEDIATION_FACTOR, null), characteristic.getPropertyTextValue(PROPERTY_REMEDIATION_FACTOR, null));
- }
- }
-
- private void initOffset() {
- if (FUNCTION_LINEAR_WITH_OFFSET.equals(function) || FUNCTION_CONSTANT_PER_ISSUE.equals(function)) {
- offset = WorkUnit.create(characteristic.getPropertyValue(PROPERTY_OFFSET, null),
- characteristic.getPropertyTextValue(PROPERTY_OFFSET, null));
- }
- }
-
- public Rule getRule() {
- return rule;
- }
-
- public TechnicalDebtCharacteristic getParent() {
- return parent;
- }
-
- public String getRemediationFunction() {
- return function;
- }
-
- @CheckForNull
- public WorkUnit getRemediationFactor() {
- return factor;
- }
-
- @CheckForNull
- public WorkUnit getOffset() {
- return offset;
- }
-
- public Characteristic toCharacteristic() {
- return characteristic;
- }
-}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java
index 86abd9c66e5..d447855dcf3 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java
@@ -20,6 +20,7 @@
package org.sonar.core.technicaldebt;
import com.google.common.collect.Maps;
+import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.rules.RuleQuery;
@@ -46,10 +47,20 @@ public class TechnicalDebtRuleCache {
return lookUpRuleInCache(repository, ruleKey);
}
+ @CheckForNull
+ public Rule getByRuleKey(RuleKey ruleKey) {
+ initRules();
+ return lookUpRuleInCache(ruleKey.repository(), ruleKey.rule());
+ }
+
public boolean exists(Rule rule) {
return getRule(rule.getRepositoryKey(), rule.getKey()) != null;
}
+ public boolean exists(RuleKey ruleKey) {
+ return getByRuleKey(ruleKey) != null;
+ }
+
private void initRules(){
if(cachedRules == null) {
loadRules();
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java
index c976e3b9801..898eae3df4a 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java
@@ -17,9 +17,11 @@
* 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.core.technicaldebt;
-import com.google.common.collect.Lists;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.codehaus.stax2.XMLInputFactory2;
@@ -29,10 +31,11 @@ import org.codehaus.staxmate.in.SMInputCursor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.ServerExtension;
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.CharacteristicProperty;
-import org.sonar.api.qualitymodel.Model;
+import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.Rule;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
import org.sonar.api.utils.ValidationMessages;
import javax.xml.stream.XMLInputFactory;
@@ -42,25 +45,34 @@ import java.io.Reader;
import java.io.StringReader;
import java.util.List;
+import static com.google.common.collect.Lists.newArrayList;
+
public class TechnicalDebtXMLImporter implements ServerExtension {
private static final Logger LOG = LoggerFactory.getLogger(TechnicalDebtXMLImporter.class);
- private static final String CHARACTERISTIC = "chc";
- private static final String CHARACTERISTIC_KEY = "key";
- private static final String CHARACTERISTIC_NAME = "name";
- private static final String CHARACTERISTIC_DESCRIPTION = "desc";
- private static final String PROPERTY = "prop";
- private static final String PROPERTY_KEY = "key";
- private static final String PROPERTY_VALUE = "val";
- private static final String PROPERTY_TEXT_VALUE = "txt";
+ 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";
+ public static final String PROPERTY_TEXT_VALUE = "txt";
+
+ public static final String REPOSITORY_KEY = "rule-repo";
+ public static final String RULE_KEY = "rule-key";
+
+ public static final String PROPERTY_FUNCTION = "remediationFunction";
+ public static final String PROPERTY_FACTOR = "remediationFactor";
+ public static final String PROPERTY_OFFSET = "offset";
- public Model importXML(String xml, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) {
+ public TechnicalDebtModel importXML(String xml, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) {
return importXML(new StringReader(xml), messages, technicalDebtRuleCache);
}
- public Model importXML(Reader xml, ValidationMessages messages, TechnicalDebtRuleCache repositoryCache) {
- Model model = Model.createByName(TechnicalDebtModel.MODEL_NAME);
+ public TechnicalDebtModel importXML(Reader xml, ValidationMessages messages, TechnicalDebtRuleCache repositoryCache) {
+ TechnicalDebtModel model = new TechnicalDebtModel();
try {
SMInputFactory inputFactory = initStax();
SMHierarchicCursor cursor = inputFactory.rootElementCursor(xml);
@@ -70,7 +82,7 @@ public class TechnicalDebtXMLImporter implements ServerExtension {
SMInputCursor chcCursor = cursor.childElementCursor(CHARACTERISTIC);
while (chcCursor.getNext() != null) {
- processCharacteristic(model, chcCursor, messages, repositoryCache);
+ processCharacteristic(model, null, chcCursor, messages, repositoryCache);
}
cursor.getStreamReader().closeCompletely();
@@ -91,13 +103,12 @@ public class TechnicalDebtXMLImporter implements ServerExtension {
return new SMInputFactory(xmlFactory);
}
- private Characteristic processCharacteristic(Model model, SMInputCursor chcCursor, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache)
- throws XMLStreamException {
- Characteristic characteristic = Characteristic.create();
- SMInputCursor cursor = chcCursor.childElementCursor();
+ private Characteristic processCharacteristic(TechnicalDebtModel model, Characteristic parent, SMInputCursor chcCursor, ValidationMessages messages,
+ TechnicalDebtRuleCache technicalDebtRuleCache) throws XMLStreamException {
+ Characteristic characteristic = new Characteristic();
+ characteristic.setParent(parent);
- String ruleRepositoryKey = null, ruleKey = null;
- List<Characteristic> children = Lists.newArrayList();
+ SMInputCursor cursor = chcCursor.childElementCursor();
while (cursor.getNext() != null) {
String node = cursor.getLocalName();
if (StringUtils.equals(node, CHARACTERISTIC_KEY)) {
@@ -106,75 +117,58 @@ public class TechnicalDebtXMLImporter implements ServerExtension {
} else if (StringUtils.equals(node, CHARACTERISTIC_NAME)) {
characteristic.setName(cursor.collectDescendantText().trim(), false);
- } else if (StringUtils.equals(node, CHARACTERISTIC_DESCRIPTION)) {
- characteristic.setDescription(cursor.collectDescendantText().trim());
-
- } else if (StringUtils.equals(node, PROPERTY)) {
- processProperty(characteristic, cursor, messages);
-
+ // <chc> can contain characteristics or requirements
} else if (StringUtils.equals(node, CHARACTERISTIC)) {
- children.add(processCharacteristic(model, cursor, messages, technicalDebtRuleCache));
+ processCharacteristic(model, characteristic, cursor, messages, technicalDebtRuleCache);
- } else if (StringUtils.equals(node, "rule-repo")) {
- ruleRepositoryKey = cursor.collectDescendantText().trim();
-
- } else if (StringUtils.equals(node, "rule-key")) {
- ruleKey = cursor.collectDescendantText().trim();
+ } else if (StringUtils.equals(node, REPOSITORY_KEY)) {
+ Requirement requirement = processRequirement(model, cursor, messages, technicalDebtRuleCache);
+ if (requirement != null) {
+ requirement.setCharacteristic(parent);
+ }
}
}
- fillRule(characteristic, ruleRepositoryKey, ruleKey, messages, technicalDebtRuleCache);
- if (StringUtils.isNotBlank(characteristic.getKey()) || characteristic.getRule() != null) {
- Characteristic convertedCharacteristic = processDeprecatedFunctionsOnRequirement(characteristic, messages);
- if (convertedCharacteristic != null) {
- addCharacteristicToModel(model, characteristic, children);
- return characteristic;
- }
+ if (StringUtils.isNotBlank(characteristic.key()) && characteristic.isRoot()) {
+ characteristic.setOrder(model.rootCharacteristics().size() + 1);
+ model.addRootCharacteristic(characteristic);
+ return characteristic;
}
return null;
}
- private void fillRule(Characteristic characteristic, String ruleRepositoryKey, String ruleKey, ValidationMessages messages,
- TechnicalDebtRuleCache technicalDebtRuleCache) {
- if (StringUtils.isNotBlank(ruleRepositoryKey) && StringUtils.isNotBlank(ruleKey)) {
- Rule rule = technicalDebtRuleCache.getRule(ruleRepositoryKey, ruleKey);
- if (rule != null) {
- characteristic.setRule(rule);
- } else {
- messages.addWarningText("Rule not found: [repository=" + ruleRepositoryKey + ", key=" + ruleKey + "]");
- }
- }
- }
+ private Requirement processRequirement(TechnicalDebtModel model, SMInputCursor cursor, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache)
+ throws XMLStreamException {
- private void addCharacteristicToModel(Model model, Characteristic characteristic, List<Characteristic> children) {
- model.addCharacteristic(characteristic);
- for (Characteristic child : children) {
- if (child != null) {
- model.addCharacteristic(child);
- characteristic.addChild(child);
+ Requirement requirement = new Requirement();
+ String ruleRepositoryKey = cursor.collectDescendantText().trim();
+ String ruleKey = null;
+ Properties properties = new Properties();
+ while (cursor.getNext() != null) {
+ String node = cursor.getLocalName();
+ if (StringUtils.equals(node, PROPERTY)) {
+ properties.add(processProperty(requirement, cursor, messages));
+ } else if (StringUtils.equals(node, RULE_KEY)) {
+ ruleKey = cursor.collectDescendantText().trim();
}
}
+ fillRule(requirement, ruleRepositoryKey, ruleKey, messages, technicalDebtRuleCache);
+ return processFunctionsOnRequirement(requirement, properties, messages);
}
- private Characteristic processDeprecatedFunctionsOnRequirement(Characteristic characteristic, ValidationMessages messages) {
- CharacteristicProperty function = characteristic.getProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FUNCTION);
- if (function != null) {
- if ("linear_threshold".equals(function.getTextValue())) {
- function.setTextValue(TechnicalDebtRequirement.FUNCTION_LINEAR);
- CharacteristicProperty offset = characteristic.getProperty(TechnicalDebtRequirement.PROPERTY_OFFSET);
- offset.setValue(0d);
- messages.addWarningText(String.format("Linear with threshold function is no more used, function of the requirement '%s:%s' is replaced by linear.",
- characteristic.getRule().getRepositoryKey(), characteristic.getRule().getKey()));
- } else if ("constant_resource".equals(function.getTextValue())) {
- messages.addWarningText(String.format("Constant/file function is no more used, requirements '%s:%s' are ignored.",
- characteristic.getRule().getRepositoryKey(), characteristic.getRule().getKey()));
- return null;
+ private void fillRule(Requirement requirement, String ruleRepositoryKey, String ruleKey, ValidationMessages messages,
+ TechnicalDebtRuleCache technicalDebtRuleCache) {
+ if (StringUtils.isNotBlank(ruleRepositoryKey) && StringUtils.isNotBlank(ruleKey)) {
+ Rule rule = technicalDebtRuleCache.getByRuleKey(RuleKey.of(ruleRepositoryKey, ruleKey));
+ if (rule != null) {
+ requirement.setRuleKey(RuleKey.of(ruleRepositoryKey, ruleKey));
+ } else {
+ messages.addWarningText("Rule not found: [repository=" + ruleRepositoryKey + ", key=" + ruleKey + "]");
}
}
- return characteristic;
}
- private void processProperty(Characteristic characteristic, SMInputCursor cursor, ValidationMessages messages) throws XMLStreamException {
+ private Property processProperty(Requirement requirement, SMInputCursor cursor, ValidationMessages messages) throws XMLStreamException {
SMInputCursor c = cursor.childElementCursor();
String key = null;
Double value = null;
@@ -195,8 +189,103 @@ public class TechnicalDebtXMLImporter implements ServerExtension {
textValue = c.collectDescendantText().trim();
}
}
- if (StringUtils.isNotBlank(key)) {
- characteristic.setProperty(key, textValue).setValue(value);
+ return new Property(key, value, textValue);
+ }
+
+ private Requirement processFunctionsOnRequirement(Requirement requirement, Properties properties, ValidationMessages messages) {
+ Property function = properties.function();
+ Property factor = properties.factor();
+ Property offset = properties.offset();
+
+ if (function != null) {
+ String functionKey = function.getTextValue();
+ if ("linear_threshold".equals(functionKey)) {
+ function.setTextValue(Requirement.FUNCTION_LINEAR);
+ offset.setValue(0d);
+ messages.addWarningText(String.format("Linear with threshold function is no more used, function of the requirement '%s' is replaced by linear.", requirement.ruleKey()));
+ } else if ("constant_resource".equals(functionKey)) {
+ messages.addWarningText(String.format("Constant/file function is no more used, requirements '%s' are ignored.", requirement.ruleKey()));
+ return null;
+ }
+
+ requirement.setFunction(function.getTextValue());
+ if (factor != null) {
+ requirement.setFactor(WorkUnit.create(factor.getValue(), factor.getTextValue()));
+ }
+ if (offset != null) {
+ requirement.setOffset(WorkUnit.create(offset.getValue(), offset.getTextValue()));
+ }
+ return requirement;
+ }
+ return null;
+ }
+
+ private class Properties {
+ List<Property> properties;
+
+ public Properties() {
+ this.properties = newArrayList();
+ }
+
+ public Properties add(Property property) {
+ this.properties.add(property);
+ return this;
+ }
+
+ public Property function() {
+ return find(PROPERTY_FUNCTION);
+ }
+
+ public Property factor() {
+ return find(PROPERTY_FACTOR);
+ }
+
+ public Property offset() {
+ return find(PROPERTY_OFFSET);
+ }
+
+ private Property find(final String key) {
+ return Iterables.find(properties, new Predicate<Property>() {
+ @Override
+ public boolean apply(Property input) {
+ return input.getKey().equals(key);
+ }
+ }, null);
+ }
+
+ }
+
+ private class Property {
+ String key;
+ Double value;
+ String textValue;
+
+ private Property(String key, Double value, String textValue) {
+ this.key = key;
+ this.value = value;
+ this.textValue = textValue;
+ }
+
+ private Property setValue(Double value) {
+ this.value = value;
+ return this;
+ }
+
+ private Property setTextValue(String textValue) {
+ this.textValue = textValue;
+ return this;
+ }
+
+ private String getKey() {
+ return key;
+ }
+
+ private Double getValue() {
+ return value;
+ }
+
+ private String getTextValue() {
+ return textValue;
}
}
}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/WorkUnit.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/WorkUnit.java
deleted file mode 100644
index 1972cc70772..00000000000
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/WorkUnit.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
-
-import javax.annotation.Nullable;
-
-public final class WorkUnit {
-
- public static final String DAYS = "d";
- public static final String MINUTES = "mn";
- public static final String HOURS = "h";
- public static final String DEFAULT_UNIT = DAYS;
- private static final String[] UNITS = {DAYS, MINUTES, HOURS};
-
- public static final double DEFAULT_VALUE = 1.0;
-
- private double value;
- private String unit;
-
- WorkUnit(double value, String unit) {
- this.value = value;
- this.unit = unit;
- }
-
- public double getValue() {
- return value;
- }
-
- public String getUnit() {
- return unit;
- }
-
- public static WorkUnit create(@Nullable Double value, @Nullable String unit) {
- unit = StringUtils.defaultIfEmpty(unit, DEFAULT_UNIT);
- if (!ArrayUtils.contains(UNITS, unit)) {
- throw new IllegalArgumentException("Remediation factor unit can not be: " + unit + ". Possible values are " + ArrayUtils.toString(UNITS));
- }
- double d = value != null ? value : DEFAULT_VALUE;
- if (d < 0.0) {
- throw new IllegalArgumentException("Remediation factor can not be negative: " + d);
- }
- return new WorkUnit(d, unit);
- }
-
- public static WorkUnit createInDays(Double value) {
- return create(value, DAYS);
- }
-}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDao.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDao.java
index 6644e9a1dee..c01599833d1 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDao.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDao.java
@@ -21,6 +21,7 @@
package org.sonar.core.technicaldebt.db;
import org.apache.ibatis.session.SqlSession;
+import org.sonar.api.BatchComponent;
import org.sonar.api.ServerComponent;
import org.sonar.core.persistence.MyBatis;
@@ -28,7 +29,7 @@ import javax.annotation.CheckForNull;
import java.util.List;
-public class CharacteristicDao implements ServerComponent {
+public class CharacteristicDao implements BatchComponent, ServerComponent {
private final MyBatis mybatis;
@@ -47,4 +48,46 @@ public class CharacteristicDao implements ServerComponent {
}
}
+ public void insert(CharacteristicDto dto, SqlSession session) {
+ session.getMapper(CharacteristicMapper.class).insert(dto);
+ }
+
+ public void insert(CharacteristicDto dto) {
+ SqlSession session = mybatis.openSession();
+ try {
+ insert(dto, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ public void update(CharacteristicDto dto, SqlSession session) {
+ session.getMapper(CharacteristicMapper.class).update(dto);
+ }
+
+ public void update(CharacteristicDto dto) {
+ SqlSession session = mybatis.openSession();
+ try {
+ update(dto, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ public void disable(Integer id, SqlSession session) {
+ session.getMapper(CharacteristicMapper.class).disable(id);
+ }
+
+ public void disable(Integer id) {
+ SqlSession session = mybatis.openSession();
+ try {
+ disable(id, session);
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java
index ccaf1671aa3..997afb6f1b8 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java
@@ -20,6 +20,11 @@
package org.sonar.core.technicaldebt.db;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
+
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
@@ -28,7 +33,7 @@ import java.util.Date;
public class CharacteristicDto implements Serializable {
- private Long id;
+ private Integer id;
private String kee;
private String name;
private Integer parentId;
@@ -43,11 +48,11 @@ public class CharacteristicDto implements Serializable {
private Date updatedAt;
private boolean enabled;
- public Long getId() {
+ public Integer getId() {
return id;
}
- public CharacteristicDto setId(Long id) {
+ public CharacteristicDto setId(Integer id) {
this.id = id;
return this;
}
@@ -180,4 +185,54 @@ public class CharacteristicDto implements Serializable {
return this;
}
+ public Characteristic toCharacteristic(Characteristic parent) {
+ return new Characteristic()
+ .setId(id)
+ .setKey(kee)
+ .setName(name)
+ .setOrder(characteristicOrder)
+ .setParent(parent)
+ .setCreatedAt(createdAt)
+ .setUpdatedAt(updatedAt);
+ }
+
+ public static CharacteristicDto toDto(Characteristic characteristic) {
+ Characteristic parent = characteristic.parent();
+ return new CharacteristicDto()
+ .setKey(characteristic.key())
+ .setName(characteristic.name())
+ .setOrder(characteristic.order())
+ .setParentId(parent != null ? parent.id() : null)
+ .setEnabled(true)
+ .setCreatedAt(characteristic.createdAt())
+ .setUpdatedAt(characteristic.updatedAt());
+ }
+
+ public Requirement toRequirement(RuleKey ruleKey, Characteristic characteristic) {
+ return new Requirement()
+ .setId(id)
+ .setRuleKey(ruleKey)
+ .setCharacteristic(characteristic)
+ .setFunction(functionKey)
+ .setFactor(WorkUnit.create(factorValue, factorUnit))
+ .setOffset(WorkUnit.create(offsetValue, offsetUnit))
+ .setCreatedAt(createdAt)
+ .setUpdatedAt(updatedAt);
+ }
+
+ public static CharacteristicDto toDto(Requirement requirement, Integer ruleId) {
+ Characteristic parent = requirement.characteristic();
+ return new CharacteristicDto()
+ .setRuleId(ruleId)
+ .setParentId(parent != null ? parent.id() : null)
+ .setFunction(requirement.function())
+ .setFactorValue(requirement.factor().getValue())
+ .setFactorUnit(requirement.factor().getUnit())
+ .setOffsetValue(requirement.offset().getValue())
+ .setOffsetUnit(requirement.offset().getUnit())
+ .setEnabled(true)
+ .setCreatedAt(requirement.createdAt())
+ .setUpdatedAt(requirement.updatedAt());
+ }
+
}
diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicMapper.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicMapper.java
index 183f10c107c..134908112dd 100644
--- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicMapper.java
+++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicMapper.java
@@ -30,4 +30,6 @@ public interface CharacteristicMapper {
int update(CharacteristicDto characteristic);
+ int disable(Integer id);
+
}
diff --git a/sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml b/sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml
index 502b24da2bd..c4c675cec57 100644
--- a/sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml
+++ b/sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml
@@ -35,7 +35,7 @@
enabled, created_at, updated_at)
VALUES (#{kee}, #{name}, #{parentId}, #{characteristicOrder},
#{ruleId}, #{functionKey}, #{factorValue}, #{factorUnit}, #{offsetValue}, #{offsetUnit},
- #{enabled}, #{createdAt}, #{updatedAt})
+ #{enabled}, current_timestamp, current_timestamp)
</insert>
<update id="update" parameterType="Characteristic">
@@ -50,7 +50,14 @@
offset_value=#{offsetValue},
offset_unit=#{offsetUnit},
enabled=#{enabled},
- updated_at=#{updatedAt}
+ updated_at=current_timestamp
+ where id=#{id}
+ </update>
+
+ <update id="disable" parameterType="Integer">
+ update characteristics set
+ enabled=${_false},
+ updated_at=current_timestamp
where id=#{id}
</update>
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtCalculatorTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtCalculatorTest.java
deleted file mode 100644
index 2da03d4f46a..00000000000
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtCalculatorTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.rule.RuleKey;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class TechnicalDebtCalculatorTest {
-
- @Mock
- TechnicalDebtModel technicalDebtModel;
-
- @Mock
- TechnicalDebtConverter converter;
-
- WorkUnit tenMinutes = WorkUnit.create(10d, WorkUnit.MINUTES);
- WorkUnit fiveMinutes = WorkUnit.create(5d, WorkUnit.MINUTES);
-
- TechnicalDebtCalculator remediationCostCalculator;
-
- @Before
- public void before() {
- when(converter.toMinutes(tenMinutes)).thenReturn(10l);
- when(converter.toMinutes(fiveMinutes)).thenReturn(5l);
-
- remediationCostCalculator = new TechnicalDebtCalculator(technicalDebtModel, converter);
- }
-
- @Test
- public void calcul_technical_debt() throws Exception {
- DefaultIssue issue = new DefaultIssue().setKey("ABCDE").setRuleKey(RuleKey.of("squid", "AvoidCycle"));
-
- TechnicalDebtRequirement requirement = mock(TechnicalDebtRequirement.class);
- Mockito.when(requirement.getRemediationFactor()).thenReturn(tenMinutes);
- Mockito.when(requirement.getOffset()).thenReturn(fiveMinutes);
- when(technicalDebtModel.getRequirementByRule("squid", "AvoidCycle")).thenReturn(requirement);
-
- remediationCostCalculator.calculTechnicalDebt(issue);
-
- verify(converter).fromMinutes(10l + 5l);
- }
-
- @Test
- public void calcul_technical_debt_with_effort_to_fix() throws Exception {
- DefaultIssue issue = new DefaultIssue().setKey("ABCDE").setRuleKey(RuleKey.of("squid", "AvoidCycle")).setEffortToFix(2d);
-
- TechnicalDebtRequirement requirement = mock(TechnicalDebtRequirement.class);
- Mockito.when(requirement.getRemediationFactor()).thenReturn(tenMinutes);
- Mockito.when(requirement.getOffset()).thenReturn(fiveMinutes);
- when(technicalDebtModel.getRequirementByRule("squid", "AvoidCycle")).thenReturn(requirement);
-
- remediationCostCalculator.calculTechnicalDebt(issue);
-
- verify(converter).fromMinutes(10l * 2 + 5l);
- }
-
- @Test
- public void calcul_technical_debt_with_no_offset() throws Exception {
- DefaultIssue issue = new DefaultIssue().setKey("ABCDE").setRuleKey(RuleKey.of("squid", "AvoidCycle")).setEffortToFix(2d);
-
- TechnicalDebtRequirement requirement = mock(TechnicalDebtRequirement.class);
- Mockito.when(requirement.getRemediationFactor()).thenReturn(tenMinutes);
- Mockito.when(requirement.getOffset()).thenReturn(null);
- when(technicalDebtModel.getRequirementByRule("squid", "AvoidCycle")).thenReturn(requirement);
-
- remediationCostCalculator.calculTechnicalDebt(issue);
-
- verify(converter).fromMinutes(10l * 2 + 0l);
- }
-
- @Test
- public void calcul_technical_debt_with_no_factor() throws Exception {
- DefaultIssue issue = new DefaultIssue().setKey("ABCDE").setRuleKey(RuleKey.of("squid", "AvoidCycle")).setEffortToFix(2d);
-
- TechnicalDebtRequirement requirement = mock(TechnicalDebtRequirement.class);
- Mockito.when(requirement.getRemediationFactor()).thenReturn(null);
- Mockito.when(requirement.getOffset()).thenReturn(fiveMinutes);
- when(technicalDebtModel.getRequirementByRule("squid", "AvoidCycle")).thenReturn(requirement);
-
- remediationCostCalculator.calculTechnicalDebt(issue);
-
- verify(converter).fromMinutes(0l * 2 + 5l);
- }
-
- @Test
- public void no_technical_debt_if_requirement_not_found() throws Exception {
- DefaultIssue issue = new DefaultIssue().setKey("ABCDE").setRuleKey(RuleKey.of("squid", "AvoidCycle"));
- when(technicalDebtModel.getRequirementByRule("squid", "AvoidCycle")).thenReturn(null);
-
- assertThat(remediationCostCalculator.calculTechnicalDebt(issue)).isNull();
- verify(converter, never()).fromMinutes(anyLong());
- }
-
-}
-
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtConverterTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtConverterTest.java
index a2c04fa960c..b158b3185cc 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtConverterTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtConverterTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
import org.junit.Test;
import org.sonar.api.config.Settings;
import org.sonar.api.issue.internal.WorkDayDuration;
+import org.sonar.api.technicaldebt.WorkUnit;
import static org.fest.assertions.Assertions.assertThat;
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtManagerTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtManagerTest.java
index 31d9cace939..b44fa279eb8 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtManagerTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtManagerTest.java
@@ -17,185 +17,253 @@
* 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.core.technicaldebt;
-import com.google.common.collect.ImmutableList;
-import com.google.common.io.Resources;
+import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.rules.Rule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
import org.sonar.api.utils.ValidationMessages;
-import org.sonar.core.qualitymodel.DefaultModelFinder;
-import org.sonar.core.rule.DefaultRuleFinder;
-import org.sonar.jpa.test.AbstractDbUnitTestCase;
+import org.sonar.core.persistence.MyBatis;
import java.io.FileNotFoundException;
-import java.io.FileReader;
+import java.io.Reader;
+import java.util.Collections;
+import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.*;
-public class TechnicalDebtManagerTest extends AbstractDbUnitTestCase {
+@RunWith(MockitoJUnitRunner.class)
+public class TechnicalDebtManagerTest {
- private static final String[] EXCLUDED_COLUMNS = new String[]{"parent_id", "function_key", "factor_value", "factor_unit", "offset_value", "offset_unit", "created_at", "updated_at"};
+ @Mock
+ MyBatis myBatis;
- private TechnicalDebtManager manager;
- private TechnicalDebtModelRepository technicalDebtModelRepository = mock(TechnicalDebtModelRepository.class);
+ @Mock
+ SqlSession session;
- @Before
- public void initAndMerge() throws Exception {
- technicalDebtModelRepository = mock(TechnicalDebtModelRepository.class);
- when(technicalDebtModelRepository.createReaderForXMLFile("technical-debt")).thenReturn(
- new FileReader(Resources.getResource(TechnicalDebtManagerTest.class, "TechnicalDebtManagerTest/fake-default-model.xml").getPath()));
+ @Mock
+ TechnicalDebtModelRepository technicalDebtModelRepository;
- manager = new TechnicalDebtManager(getSessionFactory(), new DefaultModelFinder(getSessionFactory()), technicalDebtModelRepository, new TechnicalDebtXMLImporter());
- }
+ @Mock
+ TechnicalDebtRuleCache ruleCache;
- @Test
- public void create_only_default_model_on_first_execution_when_no_plugin() throws Exception {
- setupData("empty");
+ @Mock
+ TechnicalDebtModelFinder sqaleModelFinder;
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
+ @Mock
+ TechnicalDebtModelService service;
- checkTables("create_default_model_on_first_execution", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges");
- }
+ @Mock
+ TechnicalDebtXMLImporter xmlImporter;
- @Test
- public void create_model_with_requirements_from_plugin_on_first_execution() throws Exception {
- setupData("empty");
+ private TechnicalDebtModel defaultModel;
- addPluginModel("java", "fake-java-model.xml");
+ private TechnicalDebtManager manager;
- TechnicalDebtRuleCache technicalDebtRuleCache = mock(TechnicalDebtRuleCache.class);
- Rule rule1 = Rule.create("checkstyle", "import", "Regular expression");
- rule1.setId(1);
- when(technicalDebtRuleCache.getRule("checkstyle", "import")).thenReturn(rule1);
- Rule rule2 = Rule.create("checkstyle", "export", "Regular expression");
- rule2.setId(2);
- when(technicalDebtRuleCache.getRule("checkstyle", "export")).thenReturn(rule2);
+ @Before
+ public void initAndMerge() throws Exception {
+ when(myBatis.openSession()).thenReturn(session);
- manager.initAndMergePlugins(ValidationMessages.create(), technicalDebtRuleCache);
- getSession().commit();
+ defaultModel = new TechnicalDebtModel();
+ Reader defaultModelReader = mock(Reader.class);
+ when(technicalDebtModelRepository.createReaderForXMLFile("technical-debt")).thenReturn(defaultModelReader);
+ when(xmlImporter.importXML(eq(defaultModelReader), any(ValidationMessages.class), eq(ruleCache))).thenReturn(defaultModel);
- checkTables("create_model_with_requirements_from_plugin_on_first_execution", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges", "characteristic_properties");
+ manager = new TechnicalDebtManager(myBatis, service, sqaleModelFinder, technicalDebtModelRepository, xmlImporter);
}
@Test
- public void add_new_requirements_from_plugin() throws Exception {
- setupData("add_new_requirements_from_plugin");
+ public void create_default_model_on_first_execution_when_no_plugin() throws Exception {
+ Characteristic rootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic characteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(rootCharacteristic);
+ defaultModel.addRootCharacteristic(rootCharacteristic);
- addPluginModel("java", "fake-java-model.xml");
+ when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(Collections.<String>emptyList());
+ when(sqaleModelFinder.findAll()).thenReturn(new TechnicalDebtModel());
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
+ manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
- checkTables("add_new_requirements_from_plugin", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges", "characteristic_properties");
+ verify(service).create(eq(rootCharacteristic), eq(session));
+ verify(service).create(eq(characteristic), eq(session));
+ verifyNoMoreInteractions(service);
}
@Test
- public void disable_requirements_on_removed_rules() throws Exception {
- setupData("disable_requirements_on_removed_rules");
-
- addPluginModel("java", "fake-java-model.xml");
+ public void create_model_with_requirements_from_plugin_on_first_execution() throws Exception {
+ // Default model
+ Characteristic defaultRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic characteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(defaultRootCharacteristic);
+ defaultModel.addRootCharacteristic(defaultRootCharacteristic);
+
+ // No db model
+ when(sqaleModelFinder.findAll()).thenReturn(new TechnicalDebtModel());
+
+ // Java model
+ TechnicalDebtModel javaModel = new TechnicalDebtModel();
+ Characteristic javaRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic javaCharacteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(javaRootCharacteristic);
+ javaModel.addRootCharacteristic(javaRootCharacteristic);
+
+ RuleKey ruleKey = RuleKey.of("checkstyle", "import");
+ when(ruleCache.exists(ruleKey)).thenReturn(true);
+ Requirement javaRequirement = new Requirement().setRuleKey(ruleKey)
+ .setFunction("linear").setFactor(WorkUnit.create(30.0, WorkUnit.MINUTES)).setCharacteristic(javaCharacteristic);
+
+ Reader javaModelReader = mock(Reader.class);
+ when(technicalDebtModelRepository.createReaderForXMLFile("java")).thenReturn(javaModelReader);
+ when(xmlImporter.importXML(eq(javaModelReader), any(ValidationMessages.class), eq(ruleCache))).thenReturn(javaModel);
+ when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(newArrayList("java"));
+
+ manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
+
+ verify(service).create(eq(defaultRootCharacteristic), eq(session));
+ verify(service).create(eq(characteristic), eq(session));
+ verify(service).create(eq(javaRequirement), eq(javaCharacteristic), eq(ruleCache), eq(session));
+ verifyNoMoreInteractions(service);
+ }
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
+ @Test
+ public void add_new_requirements_from_plugin() throws Exception {
+ // Default model
+ Characteristic defaultRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(defaultRootCharacteristic);
+ defaultModel.addRootCharacteristic(defaultRootCharacteristic);
+
+ // Db model
+ TechnicalDebtModel dbModel = new TechnicalDebtModel();
+ Characteristic dbRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic dbCharacteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(dbRootCharacteristic);
+ dbModel.addRootCharacteristic(dbRootCharacteristic);
+
+ RuleKey ruleKey1 = RuleKey.of("checkstyle", "import");
+ when(ruleCache.exists(ruleKey1)).thenReturn(true);
+ // Existing requirement
+ new Requirement().setRuleKey(ruleKey1)
+ .setFunction("linear").setFactor(WorkUnit.create(30.0, WorkUnit.MINUTES)).setCharacteristic(dbCharacteristic);
+
+ when(sqaleModelFinder.findAll()).thenReturn(dbModel);
+
+ // Java model
+ TechnicalDebtModel javaModel = new TechnicalDebtModel();
+ Characteristic javaRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic javaCharacteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(javaRootCharacteristic);
+ javaModel.addRootCharacteristic(javaRootCharacteristic);
+
+ RuleKey ruleKey2 = RuleKey.of("checkstyle", "export");
+ when(ruleCache.exists(ruleKey2)).thenReturn(true);
+ // New requirement
+ Requirement javaRequirement = new Requirement().setRuleKey(ruleKey2)
+ .setFunction("linear").setFactor(WorkUnit.create(1.0, WorkUnit.HOURS)).setCharacteristic(javaCharacteristic);
+
+ Reader javaModelReader = mock(Reader.class);
+ when(technicalDebtModelRepository.createReaderForXMLFile("java")).thenReturn(javaModelReader);
+ when(xmlImporter.importXML(eq(javaModelReader), any(ValidationMessages.class), eq(ruleCache))).thenReturn(javaModel);
+ when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(newArrayList("java"));
+
+ manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
+
+ verify(service).create(eq(javaRequirement), eq(javaCharacteristic), eq(ruleCache), eq(session));
+ verifyNoMoreInteractions(service);
+ }
- checkTables("disable_requirements_on_removed_rules", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges", "characteristic_properties");
+ @Test
+ public void disable_requirements_on_not_existing_rules() throws Exception {
+ // Default model
+ Characteristic defaultRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(defaultRootCharacteristic);
+ defaultModel.addRootCharacteristic(defaultRootCharacteristic);
+
+ // Db model
+ TechnicalDebtModel dbModel = new TechnicalDebtModel();
+ Characteristic dbRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ Characteristic dbCharacteristic = new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(dbRootCharacteristic);
+ dbModel.addRootCharacteristic(dbRootCharacteristic);
+
+ RuleKey ruleKey1 = RuleKey.of("checkstyle", "import");
+ when(ruleCache.exists(ruleKey1)).thenReturn(false);
+ // To be disabled as rule does not exists
+ Requirement dbRequirement = new Requirement().setRuleKey(ruleKey1)
+ .setFunction("linear").setFactor(WorkUnit.create(30.0, WorkUnit.MINUTES)).setCharacteristic(dbCharacteristic);
+
+ when(sqaleModelFinder.findAll()).thenReturn(dbModel);
+
+ TechnicalDebtModel result = manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
+
+ verify(service).disable(eq(dbRequirement), eq(session));
+ verifyNoMoreInteractions(service);
+ assertThat(result.requirements()).isEmpty();
}
@Test
public void fail_when_plugin_defines_characteristics_not_defined_in_default_model() throws Exception {
- setupData("fail_when_plugin_defines_characteristics_not_defined_in_default_model");
-
- addPluginModel("java", "fake-java-model-adding-unknown-characteristic.xml");
-
try {
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
+ // Default and db model
+ Characteristic defaultRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setParent(defaultRootCharacteristic);
+ defaultModel.addRootCharacteristic(defaultRootCharacteristic);
+ when(sqaleModelFinder.findAll()).thenReturn(defaultModel);
+
+ // Java model
+ TechnicalDebtModel javaModel = new TechnicalDebtModel();
+ Characteristic javaRootCharacteristic = new Characteristic().setKey("PORTABILITY");
+ new Characteristic().setKey("NEW_CHARACTERISTIC").setParent(javaRootCharacteristic);
+ javaModel.addRootCharacteristic(javaRootCharacteristic);
+
+ Reader javaModelReader = mock(Reader.class);
+ when(technicalDebtModelRepository.createReaderForXMLFile("java")).thenReturn(javaModelReader);
+ when(xmlImporter.importXML(eq(javaModelReader), any(ValidationMessages.class), eq(ruleCache))).thenReturn(javaModel);
+ when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(newArrayList("java"));
+
+ manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
fail();
} catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class);
+ assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("The characteristic : NEW_CHARACTERISTIC cannot be used as it's not available in default characteristics.");
+ } finally {
+ verifyZeroInteractions(service);
}
- checkTables("fail_when_plugin_defines_characteristics_not_defined_in_default_model", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges", "characteristic_properties");
}
@Test
- public void recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it() throws Exception {
- setupData("recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it");
+ public void provided_plugin_should_not_override_default_characteristics_name() throws FileNotFoundException {
+ // Default and db model
+ Characteristic defaultRootCharacteristic = new Characteristic().setKey("PORTABILITY").setName("Portability");
+ new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setName("Compiler").setParent(defaultRootCharacteristic);
+ defaultModel.addRootCharacteristic(defaultRootCharacteristic);
+ when(sqaleModelFinder.findAll()).thenReturn(defaultModel);
- addPluginModel("java", "fake-java-model.xml");
+ // Java model
+ TechnicalDebtModel javaModel = new TechnicalDebtModel();
+ Characteristic javaRootCharacteristic = new Characteristic().setKey("PORTABILITY").setName("New Portability Name");
+ new Characteristic().setKey("COMPILER_RELATED_PORTABILITY").setName("New Compiler Name").setParent(javaRootCharacteristic);
+ javaModel.addRootCharacteristic(javaRootCharacteristic);
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
+ Reader javaModelReader = mock(Reader.class);
+ when(technicalDebtModelRepository.createReaderForXMLFile("java")).thenReturn(javaModelReader);
+ when(xmlImporter.importXML(eq(javaModelReader), any(ValidationMessages.class), eq(ruleCache))).thenReturn(javaModel);
+ when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(newArrayList("java"));
- checkTables("recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it", EXCLUDED_COLUMNS, "quality_models", "characteristics", "characteristic_edges", "characteristic_properties");
- }
+ TechnicalDebtModel model = manager.initAndMergePlugins(ValidationMessages.create(), ruleCache);
- @Test
- public void provided_plugin_should_not_override_default_characteristics_name() throws FileNotFoundException {
- Model model = manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
// Default model values
- assertThat(model.getCharacteristicByKey("PORTABILITY").getName()).isEqualTo("Portability");
- assertThat(model.getCharacteristicByKey("COMPILER_RELATED_PORTABILITY").getName()).isEqualTo("Compiler related portability");
- assertThat(model.getCharacteristicByKey("HARDWARE_RELATED_PORTABILITY").getName()).isEqualTo("Hardware related portability");
- assertThat(model.getCharacteristicByKey("MAINTAINABILITY").getName()).isEqualTo("Maintainability");
+ assertThat(model.characteristicByKey("PORTABILITY").name()).isEqualTo("Portability");
+ assertThat(model.characteristicByKey("COMPILER_RELATED_PORTABILITY").name()).isEqualTo("Compiler");
// Plugin has renamed it, but the value should stay as defined by default model
- assertThat(model.getCharacteristicByKey("READABILITY").getName()).isEqualTo("Readability");
- }
-
- @Test
- public void no_failure_on_unknown_rule() throws FileNotFoundException {
- setupData("empty");
+ assertThat(model.characteristicByKey("PORTABILITY").name()).isEqualTo("Portability");
- addPluginModel("java", "fake-java-model.xml");
-
- TechnicalDebtRuleCache technicalDebtRuleCache = mock(TechnicalDebtRuleCache.class);
- Rule rule1 = Rule.create("checkstyle", "import", "Regular expression");
- rule1.setId(1);
- when(technicalDebtRuleCache.getRule("checkstyle", "import")).thenReturn(rule1);
- Rule rule2 = Rule.create("checkstyle", "export", "Regular expression");
- rule2.setId(2);
- when(technicalDebtRuleCache.getRule("checkstyle", "export")).thenReturn(rule2);
-
- ValidationMessages messages = ValidationMessages.create();
- manager.initAndMergePlugins(messages, technicalDebtRuleCache);
- getSession().commit();
-
- assertThat(messages.getWarnings()).hasSize(1);
- assertThat(messages.getWarnings().get(0)).isEqualTo("Rule not found: [repository=checkstyle, key=ConstantNameCheck]");
+ verifyZeroInteractions(service);
}
- @Test
- public void fail_when_adding_characteristic_not_existing_in_default_characteristics() throws FileNotFoundException {
- setupData("empty");
-
- addPluginModel("java", "fake-default-model-with-addtionnal-characteristic.xml");
-
- try {
- manager.initAndMergePlugins(ValidationMessages.create(), defaultRuleCache());
- getSession().commit();
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("The characteristic : SUB_ONE cannot be used as it's not available in default ones.");
- }
- }
-
- private TechnicalDebtRuleCache defaultRuleCache() {
- return new TechnicalDebtRuleCache(new DefaultRuleFinder(getSessionFactory()));
- }
-
- private void addPluginModel(String pluginKey, String xmlFile) throws FileNotFoundException {
- when(technicalDebtModelRepository.getContributingPluginList()).thenReturn(ImmutableList.of(pluginKey));
- when(technicalDebtModelRepository.createReaderForXMLFile(pluginKey)).thenReturn(
- new FileReader(Resources.getResource(TechnicalDebtManagerTest.class, "TechnicalDebtManagerTest/" + xmlFile).getPath()));
- }
-
-
}
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java
deleted file mode 100644
index 8427c3dd7cc..00000000000
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RuleQuery;
-import org.sonar.api.utils.ValidationMessages;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class TechnicalDebtMergeModelTest {
-
- private Model model;
- private TechnicalDebtMergeModel technicalDebtMergeModel;
-
- @Before
- public void setUpModel() {
- model = Model.createByName(TechnicalDebtModel.MODEL_NAME);
- technicalDebtMergeModel = new TechnicalDebtMergeModel(model);
- }
-
- @Test
- public void merge_with_empty_model() {
- Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME);
- Characteristic efficiency = with.createCharacteristicByKey("efficiency", "Efficiency");
- Characteristic ramEfficiency = with.createCharacteristicByKey("ram-efficiency", "RAM Efficiency");
- efficiency.addChild(ramEfficiency);
-
- ValidationMessages messages = ValidationMessages.create();
-
- technicalDebtMergeModel.mergeWith(with, messages, mockRuleCache());
-
- assertThat(model.getCharacteristics()).hasSize(2);
- assertThat(model.getRootCharacteristics()).hasSize(1);
- assertThat(model.getCharacteristicByKey("ram-efficiency").getDepth()).isEqualTo(Characteristic.ROOT_DEPTH + 1);
- assertThat(messages.getErrors()).isEmpty();
- }
-
- @Test
- public void not_update_existing_characteristics() {
- model.createCharacteristicByKey("efficiency", "Efficiency");
-
- Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME);
- with.createCharacteristicByKey("efficiency", "New efficiency");
-
- technicalDebtMergeModel.mergeWith(with, ValidationMessages.create(), mockRuleCache());
-
- assertThat(model.getCharacteristics()).hasSize(1);
- assertThat(model.getRootCharacteristics()).hasSize(1);
- assertThat(model.getCharacteristicByKey("efficiency").getName()).isEqualTo("Efficiency");
- }
-
- @Test
- public void warn_on_missing_rule() {
- Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME);
- Characteristic efficiency = with.createCharacteristicByKey("efficiency", "Efficiency");
- Rule fooRule = Rule.create("foo", "bar", "Bar");
- Characteristic requirement = with.createCharacteristicByRule(fooRule);
- efficiency.addChild(requirement);
-
- ValidationMessages messages = ValidationMessages.create();
-
- technicalDebtMergeModel.mergeWith(with, messages, mockRuleCache());
-
- assertThat(model.getCharacteristics()).hasSize(1);
- assertThat(model.getCharacteristicByKey("efficiency").getName()).isEqualTo("Efficiency");
- assertThat(model.getCharacteristicByRule(fooRule)).isNull();
- assertThat(messages.getWarnings()).hasSize(1);
- assertThat(messages.getWarnings().get(0)).contains("foo"); // warning: the rule foo does not exist
- }
-
- private TechnicalDebtRuleCache mockRuleCache() {
- RuleFinder ruleFinder = mock(RuleFinder.class);
- when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(newArrayList(newRegexpRule()));
- return new TechnicalDebtRuleCache(ruleFinder);
- }
-
- private Rule newRegexpRule() {
- return Rule.create("checkstyle", "regexp", "Regular expression");
- }
-}
-
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java
new file mode 100644
index 00000000000..bc4cf99211e
--- /dev/null
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java
@@ -0,0 +1,111 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.core.technicaldebt;
+
+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.rule.RuleKey;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
+import org.sonar.core.rule.DefaultRuleFinder;
+import org.sonar.core.technicaldebt.db.CharacteristicDao;
+import org.sonar.core.technicaldebt.db.CharacteristicDto;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TechnicalDebtModelFinderTest {
+
+ @Mock
+ CharacteristicDao dao;
+
+ @Mock
+ DefaultRuleFinder ruleFinder;
+
+ TechnicalDebtModelFinder finder;
+
+ @Before
+ public void setUp() throws Exception {
+ finder = new TechnicalDebtModelFinder(dao, ruleFinder);
+ }
+
+ @Test
+ public void find_all() throws Exception {
+ CharacteristicDto rootCharacteristicDto = new CharacteristicDto()
+ .setId(1)
+ .setKey("MEMORY_EFFICIENCY")
+ .setName("Memory use");
+
+ CharacteristicDto characteristicDto = new CharacteristicDto()
+ .setId(2)
+ .setKey("EFFICIENCY")
+ .setName("Efficiency")
+ .setParentId(1);
+
+ CharacteristicDto requirementDto = new CharacteristicDto()
+ .setId(3)
+ .setParentId(2)
+ .setRuleId(100)
+ .setFunction("linear")
+ .setFactorValue(2d)
+ .setFactorUnit(WorkUnit.DAYS)
+ .setOffsetValue(0d)
+ .setOffsetUnit(WorkUnit.DEFAULT_UNIT);
+
+ RuleKey ruleKey = RuleKey.of("checkstyle", "Regexp");
+ Rule rule = Rule.create(ruleKey.repository(), ruleKey.rule());
+ rule.setId(100);
+ when(ruleFinder.findByIds(newArrayList(100))).thenReturn(newArrayList(rule));
+ when(dao.selectEnabledCharacteristics()).thenReturn(newArrayList(rootCharacteristicDto, characteristicDto, requirementDto));
+
+ TechnicalDebtModel result = finder.findAll();
+ assertThat(result.rootCharacteristics()).hasSize(1);
+
+ Characteristic rootCharacteristic = result.characteristicByKey("MEMORY_EFFICIENCY");
+ assertThat(rootCharacteristic.key()).isEqualTo("MEMORY_EFFICIENCY");
+ assertThat(rootCharacteristic.name()).isEqualTo("Memory use");
+ assertThat(rootCharacteristic.parent()).isNull();
+ assertThat(rootCharacteristic.requirements()).isEmpty();
+ assertThat(rootCharacteristic.children()).hasSize(1);
+ assertThat(rootCharacteristic.children().get(0).key()).isEqualTo("EFFICIENCY");
+
+ Characteristic characteristic = result.characteristicByKey("EFFICIENCY");
+ assertThat(characteristic.key()).isEqualTo("EFFICIENCY");
+ assertThat(characteristic.name()).isEqualTo("Efficiency");
+ assertThat(characteristic.parent().key()).isEqualTo("MEMORY_EFFICIENCY");
+ assertThat(characteristic.children()).isEmpty();
+ assertThat(characteristic.requirements()).hasSize(1);
+ assertThat(characteristic.requirements().get(0).ruleKey()).isEqualTo(ruleKey);
+
+ Requirement requirement = result.requirementsByRule(ruleKey);
+ assertThat(requirement.ruleKey()).isEqualTo(ruleKey);
+ assertThat(requirement.function()).isEqualTo("linear");
+ assertThat(requirement.factor()).isEqualTo(WorkUnit.create(2d, WorkUnit.DAYS));
+ assertThat(requirement.offset()).isEqualTo(WorkUnit.create(0d, WorkUnit.DEFAULT_UNIT));
+ }
+}
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest.java
index 7862ace9dce..0b69fa82b0f 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest.java
@@ -48,7 +48,7 @@ import static org.mockito.Mockito.when;
public class TechnicalDebtModelRepositoryTest {
- private static final String TEST_XML_PREFIX_PATH = "org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/";
+ private static final String TEST_XML_PREFIX_PATH = "org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/";
private TechnicalDebtModelRepository modelFinder;
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelTest.java
index 8384153bb8a..ff161409b57 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelTest.java
@@ -17,58 +17,87 @@
* 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.core.technicaldebt;
+import org.junit.Before;
import org.junit.Test;
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.Model;
-import org.sonar.api.qualitymodel.ModelFinder;
-import org.sonar.api.rules.Rule;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class TechnicalDebtModelTest {
- private Characteristic disabledCharacteristic = Characteristic.createByKey("DISABLED", "Disabled").setEnabled(false);
+ private TechnicalDebtModel sqaleModel;
+
+ @Before
+ public void setUp() throws Exception {
+ sqaleModel = new TechnicalDebtModel();
+ }
@Test
- public void load_model() {
- ModelFinder modelFinder = mock(ModelFinder.class);
- Model persistedModel = createModel();
- when(modelFinder.findByName(TechnicalDebtModel.MODEL_NAME)).thenReturn(persistedModel);
+ public void get_root_characteristics() throws Exception {
+ Characteristic rootCharacteristic = new Characteristic()
+ .setKey("MEMORY_EFFICIENCY")
+ .setName("Memory use");
- TechnicalDebtModel technicalDebtModel = new TechnicalDebtModel(modelFinder);
+ new Characteristic()
+ .setKey("EFFICIENCY")
+ .setName("Efficiency")
+ .setParent(rootCharacteristic);
- assertThat(technicalDebtModel.getCharacteristics()).hasSize(2);
- assertThat(technicalDebtModel.getAllRequirements()).hasSize(1);
- assertThat(technicalDebtModel.getRequirementByRule("repo", "check1").getRule().getKey()).isEqualTo("check1");
- assertThat(technicalDebtModel.getRequirementByRule("repo", "check1").getParent().getKey()).isEqualTo("CPU_EFFICIENCY");
+ sqaleModel.addRootCharacteristic(rootCharacteristic);
- // ignore disabled characteristics/requirements
- assertThat(technicalDebtModel.getCharacteristics()).excludes(disabledCharacteristic);
- assertThat(technicalDebtModel.getRequirementByRule("repo", "check2")).isNull();
+ assertThat(sqaleModel.rootCharacteristics()).hasSize(1);
+ Characteristic resultRootCharacteristic = sqaleModel.rootCharacteristics().get(0);
+ assertThat(resultRootCharacteristic).isEqualTo(rootCharacteristic);
}
- private Model createModel() {
- Model model = Model.createByName(TechnicalDebtModel.MODEL_NAME);
- Characteristic efficiency = model.createCharacteristicByKey("EFFICIENCY", "Efficiency");
- model.createCharacteristicByKey("TESTABILITY", "Testability");
+ @Test
+ public void get_characteristic_by_key() throws Exception {
+ Characteristic rootCharacteristic = new Characteristic()
+ .setKey("MEMORY_EFFICIENCY")
+ .setName("Memory use");
+
+ Characteristic characteristic = new Characteristic()
+ .setKey("EFFICIENCY")
+ .setName("Efficiency")
+ .setParent(rootCharacteristic);
+
+ sqaleModel.addRootCharacteristic(rootCharacteristic);
+
+ assertThat(sqaleModel.characteristicByKey("MEMORY_EFFICIENCY")).isEqualTo(rootCharacteristic);
+ assertThat(sqaleModel.characteristicByKey("EFFICIENCY")).isEqualTo(characteristic);
+ assertThat(sqaleModel.characteristicByKey("EFFICIENCY").parent()).isEqualTo(rootCharacteristic);
+
+ assertThat(sqaleModel.characteristicByKey("UNKNOWN")).isNull();
+ }
+
+ @Test
+ public void get_requirement_by_rule_key() throws Exception {
+ Characteristic rootCharacteristic = new Characteristic()
+ .setKey("MEMORY_EFFICIENCY")
+ .setName("Memory use");
- Characteristic cpuEfficiency = model.createCharacteristicByKey("CPU_EFFICIENCY", "CPU Efficiency");
- efficiency.addChild(cpuEfficiency);
+ Characteristic characteristic = new Characteristic()
+ .setKey("EFFICIENCY")
+ .setName("Efficiency")
+ .setParent(rootCharacteristic);
- Characteristic requirement1 = model.createCharacteristicByRule(Rule.create("repo", "check1", "Check One"));
- cpuEfficiency.addChild(requirement1);
+ RuleKey ruleKey = RuleKey.of("checkstyle", "Regexp");
+ Requirement requirement = new Requirement()
+ .setCharacteristic(characteristic)
+ .setRuleKey(ruleKey)
+ .setFunction("linear")
+ .setFactor(WorkUnit.create(2d, WorkUnit.HOURS))
+ .setOffset(WorkUnit.create(0d, WorkUnit.HOURS));
- // disabled requirement
- Characteristic requirement2 = model.createCharacteristicByRule(Rule.create("repo", "check2", "Check Two"));
- requirement2.setEnabled(false);
- cpuEfficiency.addChild(requirement2);
+ sqaleModel.addRootCharacteristic(rootCharacteristic);
- // disabled characteristic
- model.addCharacteristic(disabledCharacteristic);
- return model;
+ assertThat(sqaleModel.requirementsByRule(ruleKey)).isEqualTo(requirement);
+ assertThat(sqaleModel.requirementsByRule(RuleKey.of("not", "found"))).isNull();
}
}
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRequirementTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRequirementTest.java
deleted file mode 100644
index f56e86072f8..00000000000
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRequirementTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.technicaldebt;
-
-import org.junit.Test;
-import org.sonar.api.qualitymodel.Characteristic;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class TechnicalDebtRequirementTest {
-
- @Test
- public void default_factor() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFactor().getValue()).isEqualTo(WorkUnit.DEFAULT_VALUE);
- assertThat(requirement.getRemediationFactor().getUnit()).isEqualTo(WorkUnit.DEFAULT_UNIT);
- }
-
- @Test
- public void overridde_factor() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FACTOR, 3.14);
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFactor().getValue()).isEqualTo(3.14);
- assertThat(requirement.getRemediationFactor().getUnit()).isEqualTo(WorkUnit.DAYS);
- }
-
- @Test
- public void default_function_is_linear() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFunction()).isEqualTo(TechnicalDebtRequirement.FUNCTION_LINEAR);
- assertThat(requirement.getOffset()).isNull();
- }
-
- @Test
- public void linear() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FUNCTION, TechnicalDebtRequirement.FUNCTION_LINEAR);
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FACTOR, 3.14);
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFunction()).isEqualTo(TechnicalDebtRequirement.FUNCTION_LINEAR);
- assertThat(requirement.getRemediationFactor().getValue()).isEqualTo(3.14);
- assertThat(requirement.getRemediationFactor().getUnit()).isEqualTo(WorkUnit.DAYS);
- assertThat(requirement.getOffset()).isNull();
- }
-
- @Test
- public void default_linear_with_offset() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FUNCTION, TechnicalDebtRequirement.FUNCTION_LINEAR_WITH_OFFSET);
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFunction()).isEqualTo(TechnicalDebtRequirement.FUNCTION_LINEAR_WITH_OFFSET);
- assertThat(requirement.getRemediationFactor().getValue()).isEqualTo(WorkUnit.DEFAULT_VALUE);
- assertThat(requirement.getRemediationFactor().getUnit()).isEqualTo(WorkUnit.DEFAULT_UNIT);
- assertThat(requirement.getOffset().getValue()).isEqualTo(WorkUnit.DEFAULT_VALUE);
- assertThat(requirement.getOffset().getUnit()).isEqualTo(WorkUnit.DEFAULT_UNIT);
- }
-
- @Test
- public void linear_with_offset() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FUNCTION, TechnicalDebtRequirement.FUNCTION_LINEAR_WITH_OFFSET);
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_OFFSET, 5.0);
- persistedRequirement.addProperty(persistedRequirement.getProperty(TechnicalDebtRequirement.PROPERTY_OFFSET).setTextValue("h"));
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFunction()).isEqualTo(TechnicalDebtRequirement.FUNCTION_LINEAR_WITH_OFFSET);
- assertThat(requirement.getOffset().getValue()).isEqualTo(5.0);
- assertThat(requirement.getOffset().getUnit()).isEqualTo(WorkUnit.HOURS);
- }
-
- @Test
- public void constant_per_issue() {
- Characteristic persistedRequirement = Characteristic.createByName("Efficiency");
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_REMEDIATION_FUNCTION, TechnicalDebtRequirement.FUNCTION_CONSTANT_PER_ISSUE);
- persistedRequirement.setProperty(TechnicalDebtRequirement.PROPERTY_OFFSET, 5.0);
- persistedRequirement.addProperty(persistedRequirement.getProperty(TechnicalDebtRequirement.PROPERTY_OFFSET).setTextValue("h"));
-
- TechnicalDebtRequirement requirement = new TechnicalDebtRequirement(persistedRequirement, null);
- assertThat(requirement.getRemediationFunction()).isEqualTo(TechnicalDebtRequirement.FUNCTION_CONSTANT_PER_ISSUE);
- assertThat(requirement.getRemediationFactor()).isNull();
- assertThat(requirement.getOffset().getValue()).isEqualTo(5.0);
- assertThat(requirement.getOffset().getUnit()).isEqualTo(WorkUnit.HOURS);
- }
-
-}
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java
index 6e9c94e246a..88541b6850d 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java
@@ -17,6 +17,7 @@
* 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.core.technicaldebt;
import com.google.common.base.Charsets;
@@ -25,11 +26,12 @@ import com.google.common.io.Resources;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
-import org.sonar.api.qualitymodel.Characteristic;
-import org.sonar.api.qualitymodel.Model;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.rules.RuleQuery;
+import org.sonar.api.technicaldebt.Characteristic;
+import org.sonar.api.technicaldebt.Requirement;
+import org.sonar.api.technicaldebt.WorkUnit;
import org.sonar.api.utils.ValidationMessages;
import java.io.IOException;
@@ -39,13 +41,41 @@ import static org.fest.assertions.Assertions.assertThat;
public class TechnicalDebtXMLImporterTest {
@Test
+ public void import_characteristics() {
+ TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache();
+
+ String xml = getFileContent("import_characteristics.xml");
+
+ ValidationMessages messages = ValidationMessages.create();
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+
+ assertThat(sqale.rootCharacteristics()).hasSize(2);
+ assertThat(sqale.rootCharacteristics().get(0).key()).isEqualTo("PORTABILITY");
+ assertThat(sqale.rootCharacteristics().get(1).key()).isEqualTo("MAINTAINABILITY");
+
+ Characteristic portability = sqale.characteristicByKey("PORTABILITY");
+ assertThat(portability.order()).isEqualTo(1);
+ assertThat(portability.children()).hasSize(2);
+ assertThat(portability.children().get(0).key()).isEqualTo("COMPILER_RELATED_PORTABILITY");
+ assertThat(sqale.characteristicByKey("COMPILER_RELATED_PORTABILITY").parent().key()).isEqualTo("PORTABILITY");
+ assertThat(portability.children().get(1).key()).isEqualTo("HARDWARE_RELATED_PORTABILITY");
+ assertThat(sqale.characteristicByKey("HARDWARE_RELATED_PORTABILITY").parent().key()).isEqualTo("PORTABILITY");
+
+ Characteristic maintainability = sqale.characteristicByKey("MAINTAINABILITY");
+ assertThat(maintainability.order()).isEqualTo(2);
+ assertThat(maintainability.children()).hasSize(1);
+ assertThat(maintainability.children().get(0).key()).isEqualTo("READABILITY");
+ assertThat(sqale.characteristicByKey("READABILITY").parent().key()).isEqualTo("MAINTAINABILITY");
+ }
+
+ @Test
public void import_xml_with_linear_function() {
TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache();
String xml = getFileContent("shouldImportXML_with_linear.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
checkXmlCorrectlyImported(sqale, messages);
}
@@ -57,9 +87,9 @@ public class TechnicalDebtXMLImporterTest {
String xml = getFileContent("shouldImportXML_with_linear_with_offset.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
- checkXmlCorrectlyImported(sqale, 1.0, messages);
+ checkXmlCorrectlyImported(sqale, WorkUnit.create(1.0, "h"), messages);
}
@Test
@@ -69,9 +99,9 @@ public class TechnicalDebtXMLImporterTest {
String xml = getFileContent("shouldImportXML_with_deprecated_linear_with_threshold.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
- checkXmlCorrectlyImported(sqale, 0.0, messages);
+ checkXmlCorrectlyImported(sqale, WorkUnit.create(0.0, "h"), messages);
assertThat(messages.getWarnings()).hasSize(1);
}
@@ -82,14 +112,14 @@ public class TechnicalDebtXMLImporterTest {
String xml = getFileContent("shouldImportXML_with_deprecated_constant_per_file.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
assertThat(messages.getWarnings()).hasSize(1);
// characteristics
- assertThat(sqale.getRootCharacteristics()).hasSize(1);
- Characteristic efficiency = sqale.getCharacteristicByKey("EFFICIENCY");
- assertThat(efficiency.getChildren()).isEmpty();
+ assertThat(sqale.rootCharacteristics()).hasSize(1);
+ Characteristic efficiency = sqale.characteristicByKey("EFFICIENCY");
+ assertThat(efficiency.requirements()).isEmpty();
}
@Test
@@ -98,7 +128,7 @@ public class TechnicalDebtXMLImporterTest {
String xml = getFileContent("shouldImportXML_badly-formatted.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
checkXmlCorrectlyImported(sqale, messages);
}
@@ -109,14 +139,15 @@ public class TechnicalDebtXMLImporterTest {
String xml = getFileContent("shouldLogWarningIfRuleNotFound.xml");
ValidationMessages messages = ValidationMessages.create();
- Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
+ TechnicalDebtModel sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache);
assertThat(messages.getWarnings()).hasSize(1);
+ assertThat(messages.getWarnings().get(0)).isEqualTo("Rule not found: [repository=findbugs, key=Foo]");
// characteristics
- assertThat(sqale.getRootCharacteristics()).hasSize(1);
- Characteristic efficiency = sqale.getCharacteristicByKey("EFFICIENCY");
- assertThat(efficiency.getChildren()).isEmpty();
+ assertThat(sqale.rootCharacteristics()).hasSize(1);
+ Characteristic efficiency = sqale.characteristicByKey("EFFICIENCY");
+ assertThat(efficiency.requirements()).isEmpty();
assertThat(messages.getWarnings().get(0)).contains("findbugs");
}
@@ -140,29 +171,31 @@ public class TechnicalDebtXMLImporterTest {
return new TechnicalDebtRuleCache(finder);
}
- private void checkXmlCorrectlyImported(Model sqale, ValidationMessages messages) {
- checkXmlCorrectlyImported(sqale, null, messages);
+ private void checkXmlCorrectlyImported(TechnicalDebtModel sqale, ValidationMessages messages) {
+ checkXmlCorrectlyImported(sqale, WorkUnit.create(), messages);
}
- private void checkXmlCorrectlyImported(Model sqale, Double offset, ValidationMessages messages) {
-
+ private void checkXmlCorrectlyImported(TechnicalDebtModel sqale, WorkUnit offset, ValidationMessages messages) {
assertThat(messages.getErrors()).isEmpty();
- assertThat(sqale.getName()).isEqualTo(TechnicalDebtModel.MODEL_NAME);
// characteristics
- assertThat(sqale.getRootCharacteristics()).hasSize(2);
- assertThat(sqale.getCharacteristicByKey("USABILITY").getDescription()).isEqualTo("Estimate usability");
- Characteristic efficiency = sqale.getCharacteristicByKey("EFFICIENCY");
- assertThat(efficiency.getName()).isEqualTo("Efficiency");
+ assertThat(sqale.rootCharacteristics()).hasSize(2);
+ Characteristic efficiency = sqale.characteristicByKey("EFFICIENCY");
+ assertThat(efficiency.name()).isEqualTo("Efficiency");
// sub-characteristics
- assertThat(efficiency.getChildren()).hasSize(1);
- Characteristic requirement = efficiency.getChildren().get(0);
- assertThat(requirement.getRule().getRepositoryKey()).isEqualTo("checkstyle");
- assertThat(requirement.getRule().getKey()).isEqualTo("Regexp");
- assertThat(requirement.getPropertyTextValue("remediationFunction", null)).isEqualTo("linear");
- assertThat(requirement.getPropertyValue("remediationFactor", null)).isEqualTo(3.2);
- assertThat(requirement.getPropertyValue("offset", null)).isEqualTo(offset);
+ assertThat(efficiency.children()).hasSize(1);
+ Characteristic memoryEfficiency = sqale.characteristicByKey("MEMORY_EFFICIENCY");
+ assertThat(memoryEfficiency.name()).isEqualTo("Memory use");
+
+ // requirement
+ assertThat(memoryEfficiency.requirements()).hasSize(1);
+ Requirement requirement = memoryEfficiency.requirements().get(0);
+ assertThat(requirement.ruleKey().repository()).isEqualTo("checkstyle");
+ assertThat(requirement.ruleKey().rule()).isEqualTo("Regexp");
+ assertThat(requirement.function()).isEqualTo("linear");
+ assertThat(requirement.factor()).isEqualTo(WorkUnit.create(3.2, "h"));
+ assertThat(requirement.offset()).isEqualTo(offset);
}
private String getFileContent(String file) {
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java
index 586c01822ff..ff2ef109152 100644
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java
@@ -22,6 +22,7 @@ package org.sonar.core.technicaldebt.db;
import org.junit.Before;
import org.junit.Test;
+import org.sonar.api.utils.DateUtils;
import org.sonar.core.persistence.AbstractDaoTestCase;
import java.util.List;
@@ -30,6 +31,8 @@ import static org.fest.assertions.Assertions.assertThat;
public class CharacteristicDaoTest extends AbstractDaoTestCase {
+ private static final String[] EXCLUDED_COLUMNS = new String[]{"id", "depth", "description", "quality_model_id", "created_at", "updated_at"};
+
CharacteristicDao dao;
@Before
@@ -84,4 +87,86 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
assertThat(requirement.getUpdatedAt()).isNull();
}
+ @Test
+ public void insert_characteristic() throws Exception {
+ CharacteristicDto dto = new CharacteristicDto()
+ .setKey("COMPILER_RELATED_PORTABILITY")
+ .setName("Compiler related portability")
+ .setOrder(1)
+ .setEnabled(true)
+ .setCreatedAt(DateUtils.parseDate("2013-11-20"));
+
+ dao.insert(dto);
+
+ checkTables("insert_characteristic", EXCLUDED_COLUMNS, "characteristics");
+ }
+
+ @Test
+ public void insert_requirement() throws Exception {
+ CharacteristicDto dto = new CharacteristicDto()
+ .setParentId(2)
+ .setRuleId(1)
+ .setFunction("linear_offset")
+ .setFactorValue(20.0)
+ .setFactorUnit("mn")
+ .setOffsetValue(30.0)
+ .setOffsetUnit("h")
+ .setCreatedAt(DateUtils.parseDate("2013-11-20"))
+ .setEnabled(true);
+
+ dao.insert(dto);
+
+ checkTables("insert_requirement", EXCLUDED_COLUMNS, "characteristics");
+ }
+
+ @Test
+ public void update_characteristic() throws Exception {
+ setupData("update_characteristic");
+
+ CharacteristicDto dto = new CharacteristicDto()
+ .setId(1)
+ // The Key should not be changed
+ .setKey("NEW_KEY")
+ .setName("New name")
+ .setOrder(2)
+ // Created date should not changed
+ .setCreatedAt(DateUtils.parseDate("2013-11-22"))
+ .setEnabled(false);
+
+ dao.update(dto);
+
+ checkTables("update_characteristic", new String[]{"id", "depth", "description", "quality_model_id", "updated_at"}, "characteristics");
+ }
+
+ @Test
+ public void update_requirement() throws Exception {
+ setupData("update_requirement");
+
+ CharacteristicDto dto = new CharacteristicDto()
+ .setId(1)
+ .setParentId(3)
+ .setRuleId(2)
+ .setFunction("linear")
+ .setFactorValue(21.0)
+ .setFactorUnit("h")
+ .setOffsetValue(null)
+ .setOffsetUnit(null)
+ // Created date should not changed
+ .setCreatedAt(DateUtils.parseDate("2013-11-22"))
+ .setEnabled(false);
+
+ dao.update(dto);
+
+ checkTables("update_requirement", EXCLUDED_COLUMNS, "characteristics");
+ }
+
+ @Test
+ public void disable() throws Exception {
+ setupData("disable");
+
+ dao.disable(1);
+
+ checkTables("disable", EXCLUDED_COLUMNS, "characteristics");
+ }
+
}
diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicMapperTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicMapperTest.java
deleted file mode 100644
index 3346c0777fb..00000000000
--- a/sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicMapperTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.sonar.core.technicaldebt.db;
-
-import org.apache.ibatis.session.SqlSession;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.core.persistence.AbstractDaoTestCase;
-import org.sonar.core.persistence.MyBatis;
-
-public class CharacteristicMapperTest extends AbstractDaoTestCase {
-
- private static final String[] EXCLUDED_COLUMNS = new String[]{"id", "depth", "description", "quality_model_id"};
-
- SqlSession session;
- CharacteristicMapper mapper;
-
- @Before
- public void setUp() {
- session = getMyBatis().openSession();
- mapper = session.getMapper(CharacteristicMapper.class);
- }
-
- @After
- public void tearDown() {
- MyBatis.closeQuietly(session);
- }
-
-
- @Test
- public void insert_characteristic() throws Exception {
- CharacteristicDto dto = new CharacteristicDto()
- .setKey("COMPILER_RELATED_PORTABILITY")
- .setName("Compiler related portability")
- .setOrder(1)
- .setEnabled(true)
- .setCreatedAt(DateUtils.parseDate("2013-11-20"));
-
- mapper.insert(dto);
- session.commit();
-
- checkTables("insert_characteristic", EXCLUDED_COLUMNS, "characteristics");
- }
-
- @Test
- public void insert_requirement() throws Exception {
- CharacteristicDto dto = new CharacteristicDto()
- .setParentId(2)
- .setRuleId(1)
- .setFunction("linear_offset")
- .setFactorValue(20.0)
- .setFactorUnit("mn")
- .setOffsetValue(30.0)
- .setOffsetUnit("h")
- .setCreatedAt(DateUtils.parseDate("2013-11-20"))
- .setEnabled(true);
-
- mapper.insert(dto);
- session.commit();
-
- checkTables("insert_requirement", EXCLUDED_COLUMNS, "characteristics");
- }
-
- @Test
- public void update_characteristic() throws Exception {
- setupData("update_characteristic");
-
- CharacteristicDto dto = new CharacteristicDto()
- .setId(1L)
- // The Key should not be changed
- .setKey("NEW_KEY")
- .setName("New name")
- .setOrder(2)
- // Created date should not changed
- .setCreatedAt(DateUtils.parseDate("2013-11-22"))
- .setUpdatedAt(DateUtils.parseDate("2013-11-22"))
- .setEnabled(false);
-
- mapper.update(dto);
- session.commit();
-
- checkTables("update_characteristic", EXCLUDED_COLUMNS, "characteristics");
- }
-
- @Test
- public void update_requirement() throws Exception {
- setupData("update_requirement");
-
- CharacteristicDto dto = new CharacteristicDto()
- .setId(1L)
- .setParentId(3)
- .setRuleId(2)
- .setFunction("linear")
- .setFactorValue(21.0)
- .setFactorUnit("h")
- .setOffsetValue(null)
- .setOffsetUnit(null)
- // Created date should not changed
- .setCreatedAt(DateUtils.parseDate("2013-11-22"))
- .setUpdatedAt(DateUtils.parseDate("2013-11-22"))
- .setEnabled(false);
-
- mapper.update(dto);
- session.commit();
-
- checkTables("update_requirement", EXCLUDED_COLUMNS, "characteristics");
- }
-
-}
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin-result.xml
deleted file mode 100644
index 5619e02b586..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin-result.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <!-- New requirement -->
- <characteristics id="7" kee="[null]" name="[null]" quality_model_id="1" rule_id="2" characteristic_order="7" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
- <!-- On new requirement -->
- <characteristic_edges child_id="7" parent_id="4"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
- <!-- On new requirement -->
- <characteristic_properties id="3" characteristic_id="7" kee="remediationFactor" value="1.0" text_value="h"/>
- <characteristic_properties id="4" characteristic_id="7" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin.xml
deleted file mode 100644
index 38eafe1252c..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/add_new_requirements_from_plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_default_model_on_first_execution-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_default_model_on_first_execution-result.xml
deleted file mode 100644
index cb75b8a55e1..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_default_model_on_first_execution-result.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
- <characteristics id="2" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="3" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
- <characteristics id="4" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="5" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]" enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="2"/>
- <characteristic_edges child_id="3" parent_id="2"/>
- <characteristic_edges child_id="4" parent_id="5"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_model_with_requirements_from_plugin_on_first_execution-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_model_with_requirements_from_plugin_on_first_execution-result.xml
deleted file mode 100644
index c4e613ffc38..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/create_model_with_requirements_from_plugin_on_first_execution-result.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Requirement provided by plugin -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Requirement provided by plugin -->
- <characteristics id="5" kee="[null]" name="[null]" quality_model_id="1" rule_id="2" characteristic_order="7" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="6" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="7" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="4"/>
- <characteristic_edges child_id="6" parent_id="7"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
- <characteristic_properties id="3" characteristic_id="5" kee="remediationFactor" value="1.0" text_value="h"/>
- <characteristic_properties id="4" characteristic_id="5" kee="remediationFunction" value="[null]" text_value="linear"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules-result.xml
deleted file mode 100644
index efbd5209ac1..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules-result.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Requirement bases on still existing rule not disabled -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Disabled requirement bases on removed rule -->
- <characteristics id="5" kee="[null]" name="[null]" quality_model_id="1" rule_id="2" characteristic_order="7" depth="3"
- description="[null]" enabled="false"/>
-
- <characteristics id="6" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="7" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <!-- Linked on disabled characteristic -->
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="4"/>
- <characteristic_edges child_id="6" parent_id="7"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <!-- Linked on disabled characteristic -->
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
- <characteristic_properties id="3" characteristic_id="5" kee="remediationFactor" value="1.0" text_value="h"/>
- <characteristic_properties id="4" characteristic_id="5" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <!-- Removed rule -->
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="REMOVED" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules.xml
deleted file mode 100644
index 011235232f2..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/disable_requirements_on_removed_rules.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Requirement provided by plugin -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Requirement provided by plugin on removed rule -->
- <characteristics id="5" kee="[null]" name="[null]" quality_model_id="1" rule_id="2" characteristic_order="7" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="6" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="7" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="4"/>
- <characteristic_edges child_id="6" parent_id="7"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
- <characteristic_properties id="3" characteristic_id="5" kee="remediationFactor" value="1.0" text_value="h"/>
- <characteristic_properties id="4" characteristic_id="5" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <!-- Removed rule -->
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="REMOVED" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/empty.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/empty.xml
deleted file mode 100644
index fb0854fccbe..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/empty.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<dataset>
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model-result.xml
deleted file mode 100644
index 38eafe1252c..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model-result.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model.xml
deleted file mode 100644
index 38eafe1252c..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fail_when_plugin_defines_characteristics_not_defined_in_default_model.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="true"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model-with-addtionnal-characteristic.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model-with-addtionnal-characteristic.xml
deleted file mode 100644
index 4832aa98b46..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model-with-addtionnal-characteristic.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<sqale>
- <chc>
- <key>PORTABILITY</key>
- <name>Portability</name>
- <chc>
- <key>COMPILER_RELATED_PORTABILITY</key>
- <name>Compiler related portability</name>
- </chc>
- <chc>
- <key>HARDWARE_RELATED_PORTABILITY</key>
- <name>Hardware related portability</name>
- </chc>
- </chc>
- <chc>
- <chc>
- <key>MAINTAINABILITY</key>
- <name>Maintainability</name>
- <chc>
- <key>READABILITY</key>
- <name>Readability</name>
- </chc>
- </chc>
- </chc>
- <chc>
- <chc>
- <key>NEW_ONE</key>
- <name>New One</name>
- <chc>
- <key>SUB_ONE</key>
- <name>Sub One</name>
- </chc>
- </chc>
- </chc>
-</sqale>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model-adding-unknown-characteristic.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model-adding-unknown-characteristic.xml
deleted file mode 100644
index 19a8642bb35..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model-adding-unknown-characteristic.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<sqale>
- <chc>
- <key>PORTABILITY</key>
- <name>Portability</name>
- <chc>
- <key>COMPILER_RELATED_PORTABILITY</key>
- <name>Compiler related portability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>import</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>30.0</val>
- <txt>mn</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- <chc>
- <key>HARDWARE_RELATED_PORTABILITY</key>
- <name>Hardware related portability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>export</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>1.0</val>
- <txt>h</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- </chc>
- <chc>
- <key>MAINTAINABILITY</key>
- <name>Maintainability</name>
- <chc>
- <key>READABILITY</key>
- <!-- Rename default characteristic -->
- <name>Readability related maintainability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>ConstantNameCheck</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>10.0</val>
- <txt>mn</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- <chc>
- <!-- New characteristic -->
- <key>UNDERSTANDABILITY</key>
- <name>Understandability related maintainability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>JavadocMethodCheck</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>30.0</val>
- <txt>mn</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- </chc>
-</sqale>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model.xml
deleted file mode 100644
index 46e4a228391..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-java-model.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<sqale>
- <chc>
- <key>PORTABILITY</key>
- <name>Portability</name>
- <chc>
- <key>COMPILER_RELATED_PORTABILITY</key>
- <name>Compiler related portability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>import</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>30.0</val>
- <txt>mn</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- <chc>
- <key>HARDWARE_RELATED_PORTABILITY</key>
- <name>Hardware related portability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>export</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>1.0</val>
- <txt>h</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- </chc>
- <chc>
- <key>MAINTAINABILITY</key>
- <name>Maintainability</name>
- <chc>
- <key>READABILITY</key>
- <!-- Rename default characteristic -->
- <name>Readability related maintainability</name>
- <chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>ConstantNameCheck</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>10.0</val>
- <txt>mn</txt>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- </chc>
- </chc>
- </chc>
-</sqale>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it-result.xml
deleted file mode 100644
index 9c170ebd967..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it-result.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <!-- Removed characteristic -->
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="false"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <!-- Characteristic recreated -->
- <characteristics id="7" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="7" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- New requirement -->
- <characteristics id="8" kee="[null]" name="[null]" quality_model_id="1" rule_id="2" characteristic_order="8" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
- <!-- On recreated characteristic -->
- <characteristic_edges child_id="7" parent_id="3"/>
- <!-- On new requirement -->
- <characteristic_edges child_id="8" parent_id="7"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
- <!-- On new requirement -->
- <characteristic_properties id="3" characteristic_id="8" kee="remediationFactor" value="1.0" text_value="h"/>
- <characteristic_properties id="4" characteristic_id="8" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it.xml
deleted file mode 100644
index 81e0f506f3e..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/recreate_previously_deleted_characteristic_from_default_model_when_plugin_define_requirements_on_it.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<dataset>
- <quality_models id="1" name="SQALE"/>
-
- <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="2"
- description="[null]" enabled="true"/>
-
- <!-- Exiting requirement -->
- <characteristics id="2" kee="[null]" name="[null]" quality_model_id="1" rule_id="1" characteristic_order="6" depth="3"
- description="[null]" enabled="true"/>
-
- <characteristics id="3" kee="PORTABILITY" name="Portability" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="1" description="[null]" enabled="true"/>
- <!-- Removed characteristic -->
- <characteristics id="4" kee="HARDWARE_RELATED_PORTABILITY" name="Hardware related portability" quality_model_id="1" rule_id="[null]" characteristic_order="3" depth="2"
- description="[null]" enabled="false"/>
-
- <characteristics id="5" kee="READABILITY" name="Readability" quality_model_id="1" rule_id="[null]" characteristic_order="4" depth="2" description="[null]" enabled="true"/>
- <characteristics id="6" kee="MAINTAINABILITY" name="Maintainability" quality_model_id="1" rule_id="[null]" characteristic_order="5" depth="1" description="[null]"
- enabled="true"/>
-
- <characteristic_edges child_id="1" parent_id="3"/>
- <characteristic_edges child_id="2" parent_id="1"/>
- <characteristic_edges child_id="4" parent_id="3"/>
- <characteristic_edges child_id="5" parent_id="6"/>
-
- <characteristic_properties id="1" characteristic_id="2" kee="remediationFactor" value="30.0" text_value="mn"/>
- <characteristic_properties id="2" characteristic_id="2" kee="remediationFunction" value="[null]" text_value="linear"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="regexp" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/reset_model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/reset_model.xml
deleted file mode 100644
index c56246f07c9..00000000000
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/reset_model.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<dataset>
-
- < quality_models id="1" name="SQALE" />
-
- <characteristics id="1" kee="testability" name="Testability" quality_model_id="1" rule_id="[null]" characteristic_order="1" depth="1" description="[null]" enabled="true" />
- <characteristics id="2" kee="unit_testability" name="Unit tests" quality_model_id="1" rule_id="[null]" characteristic_order="2" depth="2" description="[null]" enabled="true" />
- <characteristic_edges child_id="2" parent_id="1"/>
-
- <rules id="1" plugin_rule_key="import" plugin_config_key="import" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="2" plugin_rule_key="export" plugin_config_key="export" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="3" plugin_rule_key="ConstantNameCheck" plugin_config_key="ConstantNameCheck" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
- <rules id="4" plugin_rule_key="JavadocMethodCheck" plugin_config_key="JavadocMethodCheck" plugin_name="checkstyle" description="[null]" priority="3" status="READY" cardinality="SINGLE" parent_id="[null]" name="Regular exp"/>
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/csharp-model.xml
index e4569a2a7bf..e4569a2a7bf 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/csharp-model.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/java-model.xml
index 0b37f562107..0b37f562107 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelRepositoryTest/java-model.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/import_characteristics.xml
index 839e019d906..bc7f7569560 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtManagerTest/fake-default-model.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/import_characteristics.xml
@@ -12,13 +12,11 @@
</chc>
</chc>
<chc>
+ <key>MAINTAINABILITY</key>
+ <name>Maintainability</name>
<chc>
- <key>MAINTAINABILITY</key>
- <name>Maintainability</name>
- <chc>
- <key>READABILITY</key>
- <name>Readability</name>
- </chc>
+ <key>READABILITY</key>
+ <name>Readability</name>
</chc>
</chc>
</sqale>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml
index e55fa2d003b..db64d45ba5f 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml
@@ -12,24 +12,31 @@
</key>
<name>Efficiency
</name>
-
<chc>
- <rule-repo>checkstyle
- </rule-repo>
- <rule-key>Regexp
- </rule-key>
- <prop>
- <key>remediationFactor
- </key>
- <val>3.2
- </val>
- </prop>
- <prop>
- <key>remediationFunction
- </key>
- <txt>linear
- </txt>
- </prop>
+ <key>MEMORY_EFFICIENCY
+ </key>
+ <name>Memory use
+ </name>
+ <chc>
+ <rule-repo>checkstyle
+ </rule-repo>
+ <rule-key>Regexp
+ </rule-key>
+ <prop>
+ <key>remediationFactor
+ </key>
+ <val>3.2
+ </val>
+ <txt>h
+ </txt>
+ </prop>
+ <prop>
+ <key>remediationFunction
+ </key>
+ <txt>linear
+ </txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_constant_per_file.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_constant_per_file.xml
index 2e13e2bd2a4..ca49d873ca5 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_constant_per_file.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_constant_per_file.xml
@@ -2,18 +2,23 @@
<chc>
<key>EFFICIENCY</key>
<name>Efficiency</name>
- <!-- Should be ignored -->
<chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>Regexp</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>3.2</val>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>constant_resource</txt>
- </prop>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <!-- Should be ignored -->
+ <chc>
+ <rule-repo>checkstyle</rule-repo>
+ <rule-key>Regexp</rule-key>
+ <prop>
+ <key>remediationFactor</key>
+ <val>3.2</val>
+ <txt>h</txt>
+ </prop>
+ <prop>
+ <key>remediationFunction</key>
+ <txt>constant_resource</txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_linear_with_threshold.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_linear_with_threshold.xml
index f46aea6e872..1a9fbfd0c6a 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_linear_with_threshold.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_deprecated_linear_with_threshold.xml
@@ -8,24 +8,28 @@
<key>EFFICIENCY</key>
<name>Efficiency</name>
<chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>Regexp</rule-key>
- <prop>
- <key>remediationFunction</key>
- <!-- Should be replaced by linear -->
- <txt>linear_threshold</txt>
- </prop>
- <prop>
- <key>remediationFactor</key>
- <val>3.2</val>
- <txt>h</txt>
- </prop>
- <!-- Should be ignored -->
- <prop>
- <key>offset</key>
- <val>1.0</val>
- <txt>h</txt>
- </prop>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <chc>
+ <rule-repo>checkstyle</rule-repo>
+ <rule-key>Regexp</rule-key>
+ <prop>
+ <key>remediationFunction</key>
+ <!-- Should be replaced by linear -->
+ <txt>linear_threshold</txt>
+ </prop>
+ <prop>
+ <key>remediationFactor</key>
+ <val>3.2</val>
+ <txt>h</txt>
+ </prop>
+ <!-- Should be ignored -->
+ <prop>
+ <key>offset</key>
+ <val>1.0</val>
+ <txt>h</txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear.xml
index 480df8f2d94..554df10e640 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear.xml
@@ -7,18 +7,22 @@
<chc>
<key>EFFICIENCY</key>
<name>Efficiency</name>
-
<chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>Regexp</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>3.2</val>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <chc>
+ <rule-repo>checkstyle</rule-repo>
+ <rule-key>Regexp</rule-key>
+ <prop>
+ <key>remediationFactor</key>
+ <val>3.2</val>
+ <txt>h</txt>
+ </prop>
+ <prop>
+ <key>remediationFunction</key>
+ <txt>linear</txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear_with_offset.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear_with_offset.xml
index 768b43b8242..b20a3afd279 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear_with_offset.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_with_linear_with_offset.xml
@@ -7,23 +7,27 @@
<chc>
<key>EFFICIENCY</key>
<name>Efficiency</name>
-
<chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>Regexp</rule-key>
- <prop>
- <key>remediationFactor</key>
- <val>3.2</val>
- </prop>
- <prop>
- <key>remediationFunction</key>
- <txt>linear</txt>
- </prop>
- <prop>
- <key>offset</key>
- <val>1.0</val>
- <txt>h</txt>
- </prop>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <chc>
+ <rule-repo>checkstyle</rule-repo>
+ <rule-key>Regexp</rule-key>
+ <prop>
+ <key>remediationFactor</key>
+ <val>3.2</val>
+ <txt>h</txt>
+ </prop>
+ <prop>
+ <key>remediationFunction</key>
+ <txt>linear</txt>
+ </prop>
+ <prop>
+ <key>offset</key>
+ <val>1.0</val>
+ <txt>h</txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml
index bd459f6dadd..479d550349c 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml
@@ -2,11 +2,14 @@
<chc>
<key>EFFICIENCY</key>
<name>Efficiency</name>
-
<chc>
- <rule-repo>findbugs</rule-repo>
- <rule-key>Foo</rule-key>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <chc>
+ <rule-repo>findbugs</rule-repo>
+ <rule-key>Foo</rule-key>
+ </chc>
</chc>
</chc>
-</sqale> \ No newline at end of file
+</sqale>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml
index 638f00ea21a..bb6bdbb4afb 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml
@@ -7,18 +7,21 @@
<chc>
<key>EFFICIENCY</key>
<name>Efficiency</name>
-
<chc>
- <rule-repo>checkstyle</rule-repo>
- <rule-key>Regexp</rule-key>
- <prop>
- <key>factor</key>
- <val>abc</val>
- </prop>
- <prop>
- <key>function</key>
- <txt>linear</txt>
- </prop>
+ <key>MEMORY_EFFICIENCY</key>
+ <name>Memory use</name>
+ <chc>
+ <rule-repo>checkstyle</rule-repo>
+ <rule-key>Regexp</rule-key>
+ <prop>
+ <key>factor</key>
+ <val>abc</val>
+ </prop>
+ <prop>
+ <key>function</key>
+ <txt>linear</txt>
+ </prop>
+ </chc>
</chc>
</chc>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable-result.xml
new file mode 100644
index 00000000000..1e24e9eba21
--- /dev/null
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable-result.xml
@@ -0,0 +1,7 @@
+<dataset>
+
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
+ created_at="2013-11-20" updated_at="[null]"/>
+
+</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable.xml
new file mode 100644
index 00000000000..74fec86e6fb
--- /dev/null
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable.xml
@@ -0,0 +1,7 @@
+<dataset>
+
+ <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+ function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[true]"
+ created_at="2013-11-20" updated_at="2013-11-22"/>
+
+</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_characteristic-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_characteristic-result.xml
index ed3d4e2c902..ed3d4e2c902 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_characteristic-result.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_characteristic-result.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_requirement-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_requirement-result.xml
index 3956e8a76e6..3956e8a76e6 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/insert_requirement-result.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_requirement-result.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic-result.xml
index 9b647c999d7..9b647c999d7 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic-result.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic-result.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic.xml
index 8a5ca549420..8a5ca549420 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_characteristic.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement-result.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement-result.xml
index 301e0589798..301e0589798 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement-result.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement-result.xml
diff --git a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement.xml
index 3956e8a76e6..3956e8a76e6 100644
--- a/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicMapperTest/update_requirement.xml
+++ b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement.xml