]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4895 Improve migration to correctly populate root_id and add root id in charact...
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 28 Nov 2013 10:22:50 +0000 (11:22 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 28 Nov 2013 10:22:50 +0000 (11:22 +0100)
21 files changed:
sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtFinder.java
sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelService.java
sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelSynchronizer.java
sonar-core/src/main/java/org/sonar/core/technicaldebt/db/CharacteristicDto.java
sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl
sonar-core/src/main/resources/org/sonar/core/technicaldebt/db/CharacteristicMapper.xml
sonar-core/src/test/java/org/sonar/core/technicaldebt/db/CharacteristicDaoTest.java
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable-result.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/disable.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_characteristic-result.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/insert_requirement-result.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/select_enabled_root_characteristics.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/select_enabled_root_characteristics_order_by_characteristic_order.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/shared.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic-result.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_characteristic.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement-result.xml
sonar-core/src/test/resources/org/sonar/core/technicaldebt/db/CharacteristicDaoTest/update_requirement.xml
sonar-plugin-api/src/main/java/org/sonar/api/technicaldebt/Characteristic.java
sonar-plugin-api/src/main/java/org/sonar/api/technicaldebt/Requirement.java
sonar-server/src/main/webapp/WEB-INF/db/migrate/462_migrate_characteristics.rb

index 4a512a7d3e95de48b72195d53964072211431844..aebbe56c4e9508da677a07eece0aa6d5ef18d5c0 100644 (file)
@@ -73,7 +73,7 @@ public class TechnicalDebtFinder implements ServerComponent, BatchComponent {
 
     Characteristic rootCharacteristic = rootCharacteristicDto.toCharacteristic(null);
     Characteristic characteristic = characteristicDto.toCharacteristic(rootCharacteristic);
-    return requirementDto.toRequirement(RuleKey.of(rule.getRepositoryKey(), rule.getKey()), characteristic);
+    return requirementDto.toRequirement(RuleKey.of(rule.getRepositoryKey(), rule.getKey()), characteristic, rootCharacteristic);
   }
 
   private void addRootCharacteristics(TechnicalDebtModel model, List<CharacteristicDto> dtos, Map<Integer, Characteristic> characteristicsById){
@@ -102,9 +102,10 @@ public class TechnicalDebtFinder implements ServerComponent, BatchComponent {
       Integer ruleId = dto.getRuleId();
       if (ruleId != null) {
         Characteristic characteristic = characteristicsById.get(dto.getParentId());
+        Characteristic rootCharacteristic = characteristicsById.get(dto.getRootId());
         Rule rule = rulesById.get(ruleId);
         RuleKey ruleKey = RuleKey.of(rule.getRepositoryKey(), rule.getKey());
-        dto.toRequirement(ruleKey, characteristic);
+        dto.toRequirement(ruleKey, characteristic, rootCharacteristic);
       }
     }
   }
index 6a56fb8dcc2d16282e26a7e7fbc5925b93f018dd..caa856103c3c776ad24d5f4803bb671b83da568d 100644 (file)
@@ -57,17 +57,17 @@ public class TechnicalDebtModelService implements ServerExtension {
     }
   }
 
-  public void create(Requirement requirement, Integer characteristicId, TechnicalDebtRuleCache ruleCache, SqlSession session) {
+  public void create(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, TechnicalDebtRuleCache ruleCache, SqlSession session) {
     Rule rule = ruleCache.getByRuleKey(requirement.ruleKey());
-    CharacteristicDto requirementDto = CharacteristicDto.toDto(requirement, characteristicId, rule.getId());
+    CharacteristicDto requirementDto = CharacteristicDto.toDto(requirement, characteristicId, rootCharacteristicId, rule.getId());
     dao.insert(requirementDto, session);
     requirement.setId(requirementDto.getId());
   }
 
-  public void create(Requirement requirement, Integer characteristicId, TechnicalDebtRuleCache ruleCache) {
+  public void create(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, TechnicalDebtRuleCache ruleCache) {
     SqlSession session = mybatis.openSession();
     try {
-      create(requirement, characteristicId, ruleCache, session);
+      create(requirement, characteristicId, rootCharacteristicId, ruleCache, session);
       session.commit();
     } finally {
       MyBatis.closeQuietly(session);
index 4828d832851fb6b4a26edd15e1d3e1af37af9951..0c885d13c9427d42f6c69f05d1321e688e3d1dd7 100644 (file)
@@ -122,7 +122,7 @@ public class TechnicalDebtModelSynchronizer implements ServerExtension {
         Rule rule = rulesCache.getByRuleKey(pluginRequirement.ruleKey());
         if (!find(existingModel, rule)) {
           CharacteristicDto characteristicDto = findCharacteristic(existingModel, pluginRequirement.characteristic().key());
-          CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(), rule.getId());
+          CharacteristicDto requirementDto = CharacteristicDto.toDto(pluginRequirement, characteristicDto.getId(),  characteristicDto.getRootId(), rule.getId());
           dao.insert(requirementDto, session);
         }
       }
index 99bc0c1f7be5de94e85703e60907987f72777f2e..5bbad0f6e58f9c497f8be999bcd6e81a6646fa8a 100644 (file)
@@ -37,6 +37,7 @@ public class CharacteristicDto implements Serializable {
   private String kee;
   private String name;
   private Integer parentId;
+  private Integer rootId;
   private Integer characteristicOrder;
   private Integer ruleId;
   private String functionKey;
@@ -87,6 +88,16 @@ public class CharacteristicDto implements Serializable {
     return this;
   }
 
+  @CheckForNull
+  public Integer getRootId() {
+    return rootId;
+  }
+
+  public CharacteristicDto setRootId(@Nullable Integer rootId) {
+    this.rootId = rootId;
+    return this;
+  }
+
   @CheckForNull
   public Integer getOrder() {
     return characteristicOrder;
@@ -192,6 +203,7 @@ public class CharacteristicDto implements Serializable {
       .setName(name)
       .setOrder(characteristicOrder)
       .setParent(parent)
+      .setRoot(parent)
       .setCreatedAt(createdAt)
       .setUpdatedAt(updatedAt);
   }
@@ -202,16 +214,18 @@ public class CharacteristicDto implements Serializable {
       .setName(characteristic.name())
       .setOrder(characteristic.order())
       .setParentId(parentId)
+      .setRootId(parentId)
       .setEnabled(true)
       .setCreatedAt(characteristic.createdAt())
       .setUpdatedAt(characteristic.updatedAt());
   }
 
-  public Requirement toRequirement(RuleKey ruleKey, Characteristic characteristic) {
+  public Requirement toRequirement(RuleKey ruleKey, Characteristic characteristic, Characteristic rootCharacteristic) {
     return new Requirement()
       .setId(id)
       .setRuleKey(ruleKey)
       .setCharacteristic(characteristic)
+      .setRootCharacteristic(rootCharacteristic)
       .setFunction(functionKey)
       .setFactor(WorkUnit.create(factorValue, factorUnit))
       .setOffset(WorkUnit.create(offsetValue, offsetUnit))
@@ -219,10 +233,11 @@ public class CharacteristicDto implements Serializable {
       .setUpdatedAt(updatedAt);
   }
 
-  public static CharacteristicDto toDto(Requirement requirement, Integer characteristicId, Integer ruleId) {
+  public static CharacteristicDto toDto(Requirement requirement, Integer characteristicId, Integer rootCharacteristicId, Integer ruleId) {
     return new CharacteristicDto()
       .setRuleId(ruleId)
       .setParentId(characteristicId)
+      .setRootId(rootCharacteristicId)
       .setFunction(requirement.function())
       .setFactorValue(requirement.factor().getValue())
       .setFactorUnit(requirement.factor().getUnit())
index 1d8e38000f68ec51c6a4728d9485c7f0ef1fd4c2..4eff6867b7567e890199215f5f0680f2d79b7447 100644 (file)
@@ -39,6 +39,7 @@ CREATE TABLE "CHARACTERISTICS" (
   "NAME" VARCHAR(100),
   "DESCRIPTION" VARCHAR(4000),
   "PARENT_ID" INTEGER,
+  "ROOT_ID" INTEGER,
   "RULE_ID" INTEGER,
   "FUNCTION_KEY" VARCHAR(100),
   "FACTOR_VALUE" DOUBLE,
index 2ee11c977cec6d5068bea0c55965ad623731731a..9d7de18876d46890ab3878064dff0f477911e2ef 100644 (file)
@@ -9,6 +9,7 @@
     c.kee as kee,
     c.name as name,
     c.parent_id as parentId,
+    c.root_id as rootId,
     c.characteristic_order as characteristicOrder,
     c.rule_id as ruleId,
     c.function_key as functionKey,
   </select>
 
   <insert id="insert" parameterType="Characteristic" keyColumn="id" useGeneratedKeys="true" keyProperty="id">
-    INSERT INTO characteristics (kee, name, parent_id, characteristic_order,
+    INSERT INTO characteristics (kee, name, parent_id, root_id, characteristic_order,
     rule_id, function_key, factor_value, factor_unit, offset_value, offset_unit,
     enabled, created_at, updated_at)
-    VALUES (#{kee}, #{name}, #{parentId}, #{characteristicOrder},
+    VALUES (#{kee}, #{name}, #{parentId}, #{rootId}, #{characteristicOrder},
     #{ruleId}, #{functionKey}, #{factorValue}, #{factorUnit}, #{offsetValue}, #{offsetUnit},
     #{enabled}, current_timestamp, current_timestamp)
   </insert>
@@ -80,6 +81,7 @@
     update characteristics set
     name=#{name},
     parent_id=#{parentId},
+    root_id=#{rootId},
     characteristic_order=#{characteristicOrder},
     rule_id=#{ruleId},
     function_key=#{functionKey},
index c1211dda7fef38e663ead808f7e66194c9ddcc46..b6f75bf764dc4316872d526108d9d886c20d5ef8 100644 (file)
@@ -53,6 +53,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     assertThat(rootCharacteristic.getKey()).isEqualTo("PORTABILITY");
     assertThat(rootCharacteristic.getName()).isEqualTo("Portability");
     assertThat(rootCharacteristic.getParentId()).isNull();
+    assertThat(rootCharacteristic.getRootId()).isNull();
     assertThat(rootCharacteristic.getRuleId()).isNull();
     assertThat(rootCharacteristic.getOrder()).isEqualTo(1);
     assertThat(rootCharacteristic.isEnabled()).isTrue();
@@ -64,6 +65,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     assertThat(characteristic.getKey()).isEqualTo("COMPILER_RELATED_PORTABILITY");
     assertThat(characteristic.getName()).isEqualTo("Compiler related portability");
     assertThat(characteristic.getParentId()).isEqualTo(1);
+    assertThat(characteristic.getRootId()).isEqualTo(1);
     assertThat(characteristic.getRuleId()).isNull();
     assertThat(characteristic.getOrder()).isNull();
     assertThat(characteristic.isEnabled()).isTrue();
@@ -75,6 +77,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     assertThat(requirement.getKey()).isNull();
     assertThat(requirement.getName()).isNull();
     assertThat(requirement.getParentId()).isEqualTo(2);
+    assertThat(requirement.getRootId()).isEqualTo(1);
     assertThat(requirement.getRuleId()).isEqualTo(1);
     assertThat(requirement.getOrder()).isNull();
     assertThat(requirement.getFunction()).isEqualTo("linear_offset");
@@ -121,6 +124,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     assertThat(dto).isNotNull();
     assertThat(dto.getId()).isEqualTo(3);
     assertThat(dto.getParentId()).isEqualTo(2);
+    assertThat(dto.getRootId()).isEqualTo(1);
   }
 
   @Test
@@ -131,11 +135,13 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     assertThat(dto).isNotNull();
     assertThat(dto.getId()).isEqualTo(2);
     assertThat(dto.getParentId()).isEqualTo(1);
+    assertThat(dto.getRootId()).isEqualTo(1);
 
     dto = dao.selectCharacteristic("PORTABILITY");
     assertThat(dto).isNotNull();
     assertThat(dto.getId()).isEqualTo(1);
     assertThat(dto.getParentId()).isNull();
+    assertThat(dto.getRootId()).isNull();
 
     assertThat(dao.selectCharacteristic("UNKNOWN")).isNull();
   }
@@ -168,6 +174,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
   public void insert_requirement() throws Exception {
     CharacteristicDto dto = new CharacteristicDto()
       .setParentId(2)
+      .setRootId(1)
       .setRuleId(1)
       .setFunction("linear_offset")
       .setFactorValue(20.0)
@@ -208,6 +215,7 @@ public class CharacteristicDaoTest extends AbstractDaoTestCase {
     CharacteristicDto dto = new CharacteristicDto()
       .setId(1)
       .setParentId(3)
+      .setRootId(1)
       .setRuleId(2)
       .setFunction("linear")
       .setFactorValue(21.0)
index 1e24e9eba213934a2c85f042a32d4c2727ca6ef3..81b97e0b518924208a0f3acab5f1e9ba29ea92f4 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_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]"/>
 
index 74fec86e6fba2d8aa5386ed5a085b283d6b686f8..a970b3244569ad0c00ac58262af3c728c4ff20fb 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_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"/>
 
index ed3d4e2c902330ba56942f603033ec156f18696b..b6e2d5df640aaca04da97fb036a95a7a79ee9751 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_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="[null]"/>
 
index 3956e8a76e6207cd19b7bb9545e1df00f8d53bc8..2b1ccb8fd6b41f5e5b3fb7ad1c187f947e5bb1b4 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="[null]" name="[null]" parent_id="2" rule_id="1" characteristic_order="[null]"
+  <characteristics id="1" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1" characteristic_order="[null]"
                    function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
                    created_at="2013-11-20" updated_at="[null]"/>
 
index 5027540100b258ff88dbbbf8ed623372e724ce75..c8200af28251434ae75ae8e3ec60374899d7a700 100644 (file)
@@ -1,25 +1,25 @@
 <dataset>
 
-  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_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"/>
 
-  <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" rule_id="[null]" characteristic_order="[null]"
+  <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="[null]"
                    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"/>
 
   <!-- requirement -->
-  <characteristics id="3" kee="[null]" name="[null]" parent_id="2" rule_id="1"
+  <characteristics id="3" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1"
                    function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
                    created_at="2013-11-20" updated_at="[null]"/>
 
   <!-- disabled characteristics -->
-  <characteristics id="4" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="1" rule_id="[null]" characteristic_order="2"
+  <characteristics id="4" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="2"
                    function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
   <!-- disabled requirement -->
-  <characteristics id="5" kee="[null]" name="[null]" parent_id="4" rule_id="1"
+  <characteristics id="5" kee="[null]" name="[null]" parent_id="4" root_id="4" rule_id="1"
                    function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
index b8148025214f13a0ffbdbc0d031051deeab633fb..00a47fd34cc930e5c5ff245665470e7509faea70 100644 (file)
@@ -1,14 +1,14 @@
 <dataset>
 
-  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="2"
                    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"/>
 
-  <characteristics id="2" kee="TESTABILITY" name="Testability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="2" kee="TESTABILITY" name="Testability" parent_id="[null]" root_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"/>
 
-  <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" rule_id="[null]" characteristic_order="4"
+  <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="4"
                    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"/>
 
index e5b8294e8297d8d6ecc28f84f37b36ac6476d7b6..d84c39d5d41e6d4fa751bfcabe655707388e8dcf 100644 (file)
@@ -1,32 +1,32 @@
 <dataset>
 
   <!-- Root characteristic -->
-  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="PORTABILITY" name="Portability" parent_id="[null]" root_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"/>
 
   <!-- Characteristic -->
-  <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" rule_id="[null]" characteristic_order="[null]"
+  <characteristics id="2" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="1" root_id="1" rule_id="[null]" characteristic_order="[null]"
                    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"/>
 
   <!-- Requirement -->
-  <characteristics id="3" kee="[null]" name="[null]" parent_id="2" rule_id="1"
+  <characteristics id="3" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1"
                    function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
                    created_at="2013-11-20" updated_at="[null]"/>
 
   <!-- Disabled root characteristic -->
-  <characteristics id="4" kee="DISABLED_ROOT_CHARACTERISTIC" name="Disabled root characteristic" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+  <characteristics id="4" kee="DISABLED_ROOT_CHARACTERISTIC" name="Disabled root characteristic" parent_id="[null]" root_id="[null]" rule_id="[null]" characteristic_order="2"
                    function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
   <!-- Disabled characteristic -->
-  <characteristics id="5" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="4" rule_id="[null]" characteristic_order="[null]"
+  <characteristics id="5" kee="DISABLED_CHARACTERISTIC" name="Disabled characteristic" parent_id="4" root_id="4" rule_id="[null]" characteristic_order="[null]"
                    function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
   <!-- Disabled requirement -->
-  <characteristics id="6" kee="[null]" name="[null]" parent_id="5" rule_id="1"
+  <characteristics id="6" kee="[null]" name="[null]" parent_id="5" root_id="4" rule_id="1"
                    function_key="linear_offset" factor_value="30.0" factor_unit="mn" offset_value="20.0" offset_unit="h" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
index 9b647c999d7cdab7f5e349d4d67cb765211ee37b..026a50563e078a969fdeb7064778df4e901206b7 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="New name" parent_id="[null]" rule_id="[null]" characteristic_order="2"
+  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="New name" parent_id="[null]" rule_id="[null]" root_id="[null]" characteristic_order="2"
                    function_key="[null]" factor_value="[null]" factor_unit="[null]" offset_value="[null]" offset_unit="[null]" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
index 8a5ca549420e75daa9f3d6033e6c0f774508c00b..b4817ece8fa5c0b226708479c4545dc0320d8ce9 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" rule_id="[null]" characteristic_order="1"
+  <characteristics id="1" kee="COMPILER_RELATED_PORTABILITY" name="Compiler related portability" parent_id="[null]" root_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-20"/>
 
index 301e05897988a3745a9106694ba75a7d423a2c83..71c4150f0cf95a0432b3809e1e154b3e69feebcd 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="[null]" name="[null]" parent_id="3" rule_id="2" characteristic_order="[null]"
+  <characteristics id="1" kee="[null]" name="[null]" parent_id="3" root_id="1" rule_id="2" characteristic_order="[null]"
                    function_key="linear" factor_value="21.0" factor_unit="h" offset_value="[null]" offset_unit="[null]" enabled="[false]"
                    created_at="2013-11-20" updated_at="2013-11-22"/>
 
index 3956e8a76e6207cd19b7bb9545e1df00f8d53bc8..2b1ccb8fd6b41f5e5b3fb7ad1c187f947e5bb1b4 100644 (file)
@@ -1,6 +1,6 @@
 <dataset>
 
-  <characteristics id="1" kee="[null]" name="[null]" parent_id="2" rule_id="1" characteristic_order="[null]"
+  <characteristics id="1" kee="[null]" name="[null]" parent_id="2" root_id="1" rule_id="1" characteristic_order="[null]"
                    function_key="linear_offset" factor_value="20.0" factor_unit="mn" offset_value="30.0" offset_unit="h" enabled="[true]"
                    created_at="2013-11-20" updated_at="[null]"/>
 
index cbb45451c9fcaa194aea3cd8cde57e768422bf03..e75baf264f36f859f1063e5be21b7b894ce70319 100644 (file)
@@ -39,6 +39,7 @@ public class Characteristic {
   private String name;
   private Integer order;
   private Characteristic parent;
+  private Characteristic root;
   private List<Characteristic> children;
   private List<Requirement> requirements;
 
@@ -107,6 +108,16 @@ public class Characteristic {
     return this;
   }
 
+  @CheckForNull
+  public Characteristic getRoot() {
+    return root;
+  }
+
+  public Characteristic setRoot(@Nullable Characteristic root) {
+    this.root = root;
+    return this;
+  }
+
   public List<Characteristic> children() {
     return children;
   }
index 66f7949aaeb714972dd8a96126abd80f1b5e27ce..47d9019d51dcbc686534a5cfc1eedd1d1bc74ed7 100644 (file)
@@ -39,6 +39,7 @@ public class Requirement {
   private Integer id;
   private RuleKey ruleKey;
   private Characteristic characteristic;
+  private Characteristic rootCharacteristic;
 
   private String function;
   private WorkUnit factor;
@@ -80,6 +81,15 @@ public class Requirement {
     return this;
   }
 
+  public Characteristic getRootCharacteristic() {
+    return rootCharacteristic;
+  }
+
+  public Requirement setRootCharacteristic(Characteristic rootCharacteristic) {
+    this.rootCharacteristic = rootCharacteristic;
+    return this;
+  }
+
   public String function() {
     return function;
   }
index 14c3ccdb58dd9ff5810a64aa40e1555613ab4340..575d8f0def7e09e2b043a37dc3c33a8cde81c2f7 100644 (file)
@@ -104,15 +104,27 @@ class MigrateCharacteristics < ActiveRecord::Migration
                 characteristic.factor_unit = 'd'
                 characteristic.offset_value = 0.0
                 characteristic.offset_unit = 'd'
+
             end
             # requirement without properties or without remediationFunction has to be disabled
           else
             requirement.enabled = false
+            requirements_to_disable << characteristic
           end
         end
 
-        characteristic.parent_id = parent_ids_by_characteristic_id[characteristic.id]
-        characteristic.root_id = parent_ids_by_characteristic_id[characteristic.parent_id] if characteristic.parent_id
+        parent_id = parent_ids_by_characteristic_id[characteristic.id]
+        # Not for root characteristics
+        if parent_id
+          characteristic.parent_id = parent_id
+          # Requirements
+          if characteristic.rule_id
+            characteristic.root_id = parent_ids_by_characteristic_id[characteristic.parent_id]
+            # Characteristics as same root_id as parent_id
+          else
+            characteristic.root_id = parent_id
+          end
+        end
         characteristic.created_at = now
         characteristic.updated_at = now
         characteristic.save