diff options
Diffstat (limited to 'sonar-core/src')
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 |