]> source.dussan.org Git - sonarqube.git/commitdiff
Merge remote-tracking branch 'origin/branch-5.0'
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 18 Feb 2015 13:42:01 +0000 (14:42 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 18 Feb 2015 13:42:01 +0000 (14:42 +0100)
14 files changed:
1  2 
server/sonar-server/src/main/java/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigration.java
server/sonar-server/src/test/java/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest.java
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/do_nothing_when_already_migrated.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/fail_if_compliance_already_exists_as_characteristic.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/fail_if_compliance_already_exists_under_wrong_characteristic.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/fail_if_usability_exists_as_sub_characteristic.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/insert_usability_at_the_top_if_security_does_exists-result.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/insert_usability_at_the_top_if_security_does_exists.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/migrate-result.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/migrate.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/not_fail_if_some_deprecated_requirements_still_exists_in_db.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/schema.sql
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/update_usability_if_already_exists-result.xml
server/sonar-server/src/test/resources/org/sonar/server/db/migrations/v51/AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest/update_usability_if_already_exists.xml

index 2da8d0a0529d06312ca26b90558b5633d97ae8ff,0000000000000000000000000000000000000000..60946cef6d47ec588220b806f44127451c7ce08d
mode 100644,000000..100644
--- /dev/null
@@@ -1,318 -1,0 +1,320 @@@
-  * @since 5.1
 +/*
 + * SonarQube, open source software quality management tool.
 + * Copyright (C) 2008-2014 SonarSource
 + * mailto:contact AT sonarsource DOT com
 + *
 + * SonarQube is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 3 of the License, or (at your option) any later version.
 + *
 + * SonarQube is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 + */
 +package org.sonar.server.db.migrations.v51;
 +
 +import com.google.common.base.Predicate;
 +import com.google.common.collect.Iterables;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
 +import org.sonar.api.utils.System2;
 +import org.sonar.core.persistence.Database;
 +import org.sonar.server.db.migrations.BaseDataChange;
 +import org.sonar.server.db.migrations.Select;
 +
 +import javax.annotation.CheckForNull;
 +import javax.annotation.Nullable;
 +
 +import java.sql.SQLException;
 +import java.util.Date;
 +import java.util.List;
 +
 +/**
 + * See http://jira.codehaus.org/browse/SONAR-6187
 + *
 + * Add a new Characteristic 'Usability' with 2 sub-characteristics 'Accessibility' and 'Ease of Use'
 + * and add a new sub-characteristic 'Compliance' for all characteristics.
 + *
 + * Nothing will be done if there's no characteristics in db, as they're all gonna be created by {@link org.sonar.server.startup.RegisterDebtModel}
 + *
-         "SELECT c.id, c.kee, c.name, c.characteristic_order, c.parent_id FROM characteristics c WHERE c.enabled=? ORDER BY c.characteristic_order")
++ * Before 4.3 the characteristics table contains requirements, then when selecting characteristics we should not forget to exclude them (with a filter on rule_id IS NULL)
++ * 
 + */
 +public class AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigration extends BaseDataChange {
 +
 +  private static final Logger LOGGER = LoggerFactory.getLogger(AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigration.class);
 +
 +  private static final String COMPLIANCE_NAME = "Compliance";
 +  private static final String COMPLIANCE_KEY_SUFFIX = "_COMPLIANCE";
 +
 +  private static final String SECURITY_KEY = "SECURITY";
 +  private static final String USABILITY_KEY = "USABILITY";
 +
 +  private final System2 system;
 +
 +  public AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigration(Database db, System2 system) {
 +    super(db);
 +    this.system = system;
 +  }
 +
 +  @Override
 +  public void execute(Context context) throws SQLException {
 +    CharacteristicsContext characteristicsContext = new CharacteristicsContext(context, system);
 +
 +    // On an empty DB, there are no characteristics, they're all gonna be created after in RegisterDebtModel
 +    if (!characteristicsContext.characteristics().isEmpty()) {
 +      int usabilityOder = moveCharacteristicsDownToBeAbleToInsertUsability(characteristicsContext);
 +      createOrUpdateUsabilityCharacteristicAndItsSubCharacteristic(characteristicsContext, usabilityOder);
 +
 +      createSubCharacteristic(characteristicsContext, "REUSABILITY" + COMPLIANCE_KEY_SUFFIX, "Reusability " + COMPLIANCE_NAME, "REUSABILITY");
 +      createSubCharacteristic(characteristicsContext, "PORTABILITY" + COMPLIANCE_KEY_SUFFIX, "Portability " + COMPLIANCE_NAME, "PORTABILITY");
 +      createSubCharacteristic(characteristicsContext, "MAINTAINABILITY" + COMPLIANCE_KEY_SUFFIX, "Maintainability " + COMPLIANCE_NAME, "MAINTAINABILITY");
 +      createSubCharacteristic(characteristicsContext, SECURITY_KEY + COMPLIANCE_KEY_SUFFIX, "Security " + COMPLIANCE_NAME, SECURITY_KEY);
 +      createSubCharacteristic(characteristicsContext, "EFFICIENCY" + COMPLIANCE_KEY_SUFFIX, "Efficiency " + COMPLIANCE_NAME, "EFFICIENCY");
 +      createSubCharacteristic(characteristicsContext, "CHANGEABILITY" + COMPLIANCE_KEY_SUFFIX, "Changeability " + COMPLIANCE_NAME, "CHANGEABILITY");
 +      createSubCharacteristic(characteristicsContext, "RELIABILITY" + COMPLIANCE_KEY_SUFFIX, "Reliability " + COMPLIANCE_NAME, "RELIABILITY");
 +      createSubCharacteristic(characteristicsContext, "TESTABILITY" + COMPLIANCE_KEY_SUFFIX, "Testability " + COMPLIANCE_NAME, "TESTABILITY");
 +    }
 +  }
 +
 +  /**
 +   * If the characteristic 'Security' exists, the new characteristic 'Usability' should be inserted just below it,
 +   * so every existing characteristics below Security should move down.
 +   *
 +   * If the characteristic 'Security' does not exists, the new characteristic 'Usability' should be the first one,
 +   * so every existing characteristics should move down.
 +   *
 +   * If the characteristic 'Usability' is already at the right place, nothing will be done.
 +   */
 +  private int moveCharacteristicsDownToBeAbleToInsertUsability(CharacteristicsContext characteristicsContext) throws SQLException {
 +    Characteristic security = characteristicsContext.findCharacteristicByKey(SECURITY_KEY);
 +    Characteristic usability = characteristicsContext.findCharacteristicByKey(USABILITY_KEY);
 +
 +    int usabilityOder = 1;
 +    int indexToStart = 0;
 +    if (security != null) {
 +      indexToStart = characteristicsContext.characteristics().indexOf(security) + 1;
 +      usabilityOder = security.getOrder() + 1;
 +    }
 +
 +    if (usability == null || usability.getOrder() != usabilityOder) {
 +      // Move root characteristics one step lower
 +      for (int i = indexToStart; i < characteristicsContext.characteristics().size(); i++) {
 +        Characteristic characteristic = characteristicsContext.characteristics().get(i);
 +        if (characteristic.getParentId() == null) {
 +          characteristicsContext.updateCharacteristicOrder(characteristic.getKey(), characteristic.getOrder() + 1);
 +        }
 +      }
 +    }
 +    return usabilityOder;
 +  }
 +
 +  private void createOrUpdateUsabilityCharacteristicAndItsSubCharacteristic(CharacteristicsContext characteristicsContext, int newUsabilityOrder)
 +    throws SQLException {
 +    String usabilityKey = USABILITY_KEY;
 +    Characteristic usability = characteristicsContext.findCharacteristicByKey(usabilityKey);
 +    if (usability != null) {
 +      if (usability.getOrder() != newUsabilityOrder) {
 +        usability.setOrder(newUsabilityOrder);
 +        characteristicsContext.updateCharacteristicOrder(usability.getKey(), usability.getOrder());
 +      }
 +    } else {
 +      usability = new Characteristic().setKey(usabilityKey).setName("Usability").setOrder(newUsabilityOrder);
 +      characteristicsContext.insertCharacteristic(usability);
 +    }
 +
 +    createSubCharacteristic(characteristicsContext, "USABILITY_ACCESSIBILITY", "Accessibility", usabilityKey);
 +    createSubCharacteristic(characteristicsContext, "USABILITY_EASE_OF_USE", "Ease of Use", usabilityKey);
 +    createSubCharacteristic(characteristicsContext, USABILITY_KEY + COMPLIANCE_KEY_SUFFIX, "Usability " + COMPLIANCE_NAME, usabilityKey);
 +  }
 +
 +  private void createSubCharacteristic(CharacteristicsContext characteristicsContext,
 +    String subCharacteristicKey, String subCharacteristicName, String parentKey) throws SQLException {
 +    Characteristic parent = characteristicsContext.findCharacteristicByKey(parentKey);
 +    if (parent != null) {
 +      Characteristic subCharacteristic = characteristicsContext.findSubCharacteristicByKey(subCharacteristicKey, parent);
 +      if (subCharacteristic == null) {
 +        characteristicsContext.insertCharacteristic(new Characteristic().setKey(subCharacteristicKey).setName(subCharacteristicName).setParentId(parent.getId()));
 +      }
 +    }
 +    // If the characteristic parent does not exits, the sub-characteristic is not added
 +  }
 +
 +  private static class Characteristic {
 +    private Integer id;
 +    private String key;
 +    private String name;
 +    private Integer order;
 +    private Integer parentId;
 +
 +    public Integer getId() {
 +      return id;
 +    }
 +
 +    public Characteristic setId(Integer id) {
 +      this.id = id;
 +      return this;
 +    }
 +
 +    public String getKey() {
 +      return key;
 +    }
 +
 +    public Characteristic setKey(String key) {
 +      this.key = key;
 +      return this;
 +    }
 +
 +    public String getName() {
 +      return name;
 +    }
 +
 +    public Characteristic setName(String name) {
 +      this.name = name;
 +      return this;
 +    }
 +
 +    /**
 +     * On a characteristic, the order can never be null
 +     */
 +    public Integer getOrder() {
 +      return parentId == null && order != null ? order : null;
 +    }
 +
 +    public Characteristic setOrder(@Nullable Integer order) {
 +      this.order = order;
 +      return this;
 +    }
 +
 +    @CheckForNull
 +    public Integer getParentId() {
 +      return parentId;
 +    }
 +
 +    public Characteristic setParentId(@Nullable Integer parentId) {
 +      this.parentId = parentId;
 +      return this;
 +    }
 +  }
 +
 +  private static class CharacteristicsContext {
 +    private final System2 system;
 +    Context context;
 +    Date now;
 +    List<Characteristic> characteristics;
 +
 +    public CharacteristicsContext(Context context, System2 system) throws SQLException {
 +      this.context = context;
 +      this.system = system;
 +      init();
 +    }
 +
 +    private void init() throws SQLException {
 +      now = new Date(system.now());
 +      characteristics = selectEnabledCharacteristics();
 +    }
 +
 +    public List<Characteristic> characteristics() {
 +      return characteristics;
 +    }
 +
 +    @CheckForNull
 +    public Characteristic findCharacteristicByKey(final String key) {
 +      Characteristic characteristic = Iterables.find(characteristics, new Predicate<Characteristic>() {
 +        @Override
 +        public boolean apply(@Nullable Characteristic input) {
 +          return input != null && input.key.equals(key);
 +        }
 +      }, null);
 +      if (characteristic != null && characteristic.getParentId() != null) {
 +        throw new IllegalStateException(String.format("'%s' must be a characteristic", characteristic.getName()));
 +      }
 +      return characteristic;
 +    }
 +
 +    @CheckForNull
 +    public Characteristic findSubCharacteristicByKey(final String key, Characteristic parent) {
 +      Characteristic characteristic = Iterables.find(characteristics, new Predicate<Characteristic>() {
 +        @Override
 +        public boolean apply(@Nullable Characteristic input) {
 +          return input != null && input.key.equals(key);
 +        }
 +      }, null);
 +      if (characteristic != null) {
 +        Integer parentId = characteristic.getParentId();
 +        if (parentId == null) {
 +          throw new IllegalStateException(String.format("'%s' must be a sub-characteristic", characteristic.getName()));
 +        } else if (!parentId.equals(parent.getId())) {
 +          throw new IllegalStateException(String.format("'%s' must be defined under '%s'", characteristic.getName(), parent.getName()));
 +        }
 +      }
 +      return characteristic;
 +    }
 +
 +    private List<Characteristic> selectEnabledCharacteristics() throws SQLException {
 +      return context.prepareSelect(
++        // Exclude requirements (to not fail when coming from a version older than 4.3)
++        "SELECT c.id, c.kee, c.name, c.characteristic_order, c.parent_id FROM characteristics c WHERE c.enabled=? AND c.rule_id IS NULL ORDER BY c.characteristic_order")
 +        .setBoolean(1, true)
 +        .list(new CharacteristicReader());
 +    }
 +
 +    private int selectCharacteristicId(String key) throws SQLException {
 +      return context.prepareSelect(
 +        "SELECT c.id FROM characteristics c WHERE c.kee = ? AND c.enabled=?")
 +        .setString(1, key)
 +        .setBoolean(2, true)
 +        .get(Select.LONG_READER).intValue();
 +    }
 +
 +    public void insertCharacteristic(Characteristic characteristic) throws SQLException {
 +      if (characteristic.getParentId() == null) {
 +        LOGGER.info("Insert new characteristic '{}'", characteristic.getKey());
 +      } else {
 +        LOGGER.info("Insert new sub characteristic '{}'", characteristic.getKey());
 +      }
 +
 +      context.prepareUpsert("INSERT INTO characteristics (kee, name, parent_id, characteristic_order, enabled, created_at) VALUES (?, ?, ?, ?, ?, ?)")
 +        .setString(1, characteristic.getKey())
 +        .setString(2, characteristic.getName())
 +        .setInt(3, characteristic.getParentId())
 +        .setInt(4, characteristic.getOrder())
 +        .setBoolean(5, true)
 +        .setDate(6, now)
 +        .execute()
 +        .commit();
 +      characteristic.setId(selectCharacteristicId(characteristic.getKey()));
 +
 +      characteristics.add(characteristic);
 +    }
 +
 +    public void updateCharacteristicOrder(String key, Integer order) throws SQLException {
 +      LOGGER.info("Update characteristic '{}' order to {}", key, order);
 +
 +      context.prepareUpsert("UPDATE characteristics SET characteristic_order=?, updated_at=? WHERE kee=?")
 +        .setInt(1, order)
 +        .setDate(2, now)
 +        .setString(3, key)
 +        .execute()
 +        .commit();
 +    }
 +
 +    private static class CharacteristicReader implements Select.RowReader<Characteristic> {
 +      @Override
 +      public Characteristic read(Select.Row row) throws SQLException {
 +        return new Characteristic()
 +          .setId(row.getInt(1))
 +          .setKey(row.getString(2))
 +          .setName(row.getString(3))
 +          .setOrder(row.getNullableInt(4))
 +          .setParentId(row.getNullableInt(5));
 +      }
 +    }
 +  }
 +}
index 4d9b9fc8b96e7aec78ee11224d345609f1b483d2,0000000000000000000000000000000000000000..f14fbebf3c22994353d2d605ba1ba2325da35778
mode 100644,000000..100644
--- /dev/null
@@@ -1,124 -1,0 +1,131 @@@
 +/*
 + * SonarQube, open source software quality management tool.
 + * Copyright (C) 2008-2014 SonarSource
 + * mailto:contact AT sonarsource DOT com
 + *
 + * SonarQube is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 3 of the License, or (at your option) any later version.
 + *
 + * SonarQube is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 + */
 +package org.sonar.server.db.migrations.v51;
 +
 +import org.junit.Before;
 +import org.junit.ClassRule;
 +import org.junit.Test;
 +import org.sonar.api.utils.DateUtils;
 +import org.sonar.api.utils.System2;
 +import org.sonar.core.persistence.DbTester;
 +import org.sonar.server.db.migrations.DatabaseMigration;
 +
 +import static junit.framework.TestCase.fail;
 +import static org.assertj.core.api.Assertions.assertThat;
 +import static org.mockito.Mockito.mock;
 +import static org.mockito.Mockito.when;
 +
 +public class AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest {
 +
 +  @ClassRule
 +  public static DbTester db = new DbTester().schema(AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigrationTest.class, "schema.sql");
 +
 +  DatabaseMigration migration;
 +
 +  System2 system = mock(System2.class);
 +
 +  @Before
 +  public void setUp() throws Exception {
 +    db.executeUpdateSql("truncate table characteristics");
 +
 +    when(system.now()).thenReturn(DateUtils.parseDate("2015-02-15").getTime());
 +
 +    migration = new AddCharacteristicUsabilityAndSubCharacteristicsComplianceMigration(db.database(), system);
 +  }
 +
 +  @Test
 +  public void migrate() throws Exception {
 +    db.prepareDbUnit(getClass(), "migrate.xml");
 +    migration.execute();
 +    db.assertDbUnit(getClass(), "migrate-result.xml", "characteristics");
 +  }
 +
 +  @Test
 +  public void do_nothing_when_already_migrated() throws Exception {
 +    db.prepareDbUnit(getClass(), "do_nothing_when_already_migrated.xml");
 +    migration.execute();
 +    db.assertDbUnit(getClass(), "do_nothing_when_already_migrated.xml", "characteristics");
 +  }
 +
 +  @Test
 +  public void do_nothing_when_no_characteristics() throws Exception {
 +    db.prepareDbUnit(getClass(), "empty.xml");
 +    migration.execute();
 +    assertThat(db.countRowsOfTable("characteristics")).isEqualTo(0);
 +  }
 +
 +  @Test
 +  public void insert_usability_at_the_top_if_security_does_exists() throws Exception {
 +    db.prepareDbUnit(getClass(), "insert_usability_at_the_top_if_security_does_exists.xml");
 +    migration.execute();
 +    db.assertDbUnit(getClass(), "insert_usability_at_the_top_if_security_does_exists-result.xml", "characteristics");
 +  }
 +
 +  @Test
 +  public void update_usability_order_if_already_exists() throws Exception {
 +    db.prepareDbUnit(getClass(), "update_usability_if_already_exists.xml");
 +    migration.execute();
 +    db.assertDbUnit(getClass(), "update_usability_if_already_exists-result.xml", "characteristics");
 +  }
 +
 +  @Test
 +  public void fail_if_usability_exists_as_sub_characteristic() throws Exception {
 +    db.prepareDbUnit(getClass(), "fail_if_usability_exists_as_sub_characteristic.xml");
 +
 +    try {
 +      migration.execute();
 +      fail();
 +    } catch (Exception e) {
 +      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("'Usability' must be a characteristic");
 +    }
 +  }
 +
 +  @Test
 +  public void fail_if_compliance_already_exists_as_characteristic() throws Exception {
 +    db.prepareDbUnit(getClass(), "fail_if_compliance_already_exists_as_characteristic.xml");
 +
 +    try {
 +      migration.execute();
 +      fail();
 +    } catch (Exception e) {
 +      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("'Compliance' must be a sub-characteristic");
 +    }
 +  }
 +
 +  @Test
 +  public void fail_if_compliance_already_exists_under_wrong_characteristic() throws Exception {
 +    db.prepareDbUnit(getClass(), "fail_if_compliance_already_exists_under_wrong_characteristic.xml");
 +
 +    try {
 +      migration.execute();
 +      fail();
 +    } catch (Exception e) {
 +      assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("'Reusability Compliance' must be defined under 'Reusability'");
 +    }
 +  }
 +
++  @Test
++  public void not_fail_if_some_deprecated_requirements_still_exists_in_db() throws Exception {
++    db.prepareDbUnit(getClass(), "not_fail_if_some_deprecated_requirements_still_exists_in_db.xml");
++    migration.execute();
++    db.assertDbUnit(getClass(), "not_fail_if_some_deprecated_requirements_still_exists_in_db.xml", "characteristics");
++  }
++
 +}
index 641a92b0c39419de3bb63f6f3ca695c1b95a646a,0000000000000000000000000000000000000000..b8ff37c389eaa3ab425a1160a285172d22e2d395
mode 100644,000000..100644
--- /dev/null
@@@ -1,44 -1,0 +1,53 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
-   <characteristics id="2" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
 +<dataset>
 +
-   <characteristics id="3" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
-   <characteristics id="4" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
++  <characteristics id="2" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
-   <characteristics id="5" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="3" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
++  <characteristics id="4" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
-   <characteristics id="6" kee="MAINTAINABILITY_COMPLIANCE" name="Maintainability Compliance" parent_id="5" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
++  <characteristics id="5" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" rule_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="2013-11-22"/>
-   <characteristics id="7" kee="SECURITY" name="Security" parent_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
-   <characteristics id="8" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="7" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="6" kee="MAINTAINABILITY_COMPLIANCE" name="Maintainability Compliance" parent_id="5" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
-   <characteristics id="9" kee="USABILITY" name="Usability" parent_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20" updated_at="[null]"/>
-   <characteristics id="10" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="7" kee="SECURITY" name="Security" parent_id="[null]" rule_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
++  <characteristics id="8" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="7" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="[null]"/>
 +
-   <characteristics id="11" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20" updated_at="[null]"/>
-   <characteristics id="12" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="9" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="[null]"/>
-   <characteristics id="13" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-20"/>
-   <characteristics id="14" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="13" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="10" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="[null]"/>
-   <characteristics id="15" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-20"/>
-   <characteristics id="16" kee="CHANGEABILITY_COMPLIANCE" name="Changeability Compliance" parent_id="15" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
++  <characteristics id="11" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="[null]"/>
++  <characteristics id="12" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
-   <characteristics id="17" kee="RELIABILITY" name="Reliability" parent_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-20"/>
-   <characteristics id="18" kee="RELIABILITY_COMPLIANCE" name="Reliability Compliance" parent_id="17" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
++  <characteristics id="13" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" rule_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-20"/>
++  <characteristics id="14" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="13" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
-   <characteristics id="19" kee="TESTABILITY" name="Testability" parent_id="[null]" characteristic_order="9" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-20"/>
-   <characteristics id="20" kee="TESTABILITY_COMPLIANCE" name="Testability Compliance" parent_id="19" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
-                    updated_at="[null]"/>
++  <characteristics id="15" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" rule_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-20"/>
++  <characteristics id="16" kee="CHANGEABILITY_COMPLIANCE" name="Changeability Compliance" parent_id="15" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
++  <characteristics id="17" kee="RELIABILITY" name="Reliability" parent_id="[null]" rule_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-20"/>
++  <characteristics id="18" kee="RELIABILITY_COMPLIANCE" name="Reliability Compliance" parent_id="17" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
++
++  <characteristics id="19" kee="TESTABILITY" name="Testability" parent_id="[null]" rule_id="[null]" characteristic_order="9" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-20"/>
++  <characteristics id="20" kee="TESTABILITY_COMPLIANCE" name="Testability Compliance" parent_id="19" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
 +
 +
 +</dataset>
index 337697d4bae17b52f31351ef24bc5ece7f0b5cbe,0000000000000000000000000000000000000000..1f2f39bdbef3ed3d0264ceb332d9a536c30acfb3
mode 100644,000000..100644
--- /dev/null
@@@ -1,7 -1,0 +1,9 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="REUSABILITY_COMPLIANCE" name="Compliance" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="[null]"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
++  <characteristics id="2" kee="REUSABILITY_COMPLIANCE" name="Compliance" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="[null]"/>
 +
 +</dataset>
index 5164abcf144c6392c7fb48799ccfc5ebba7a251b,0000000000000000000000000000000000000000..3dbfebd4153d4f2dd2814be19dfa9df568fb7aec
mode 100644,000000..100644
--- /dev/null
@@@ -1,10 -1,0 +1,13 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="3" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="2" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
++  <characteristics id="3" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="2" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20"
 +                   updated_at="[null]"/>
 +
 +</dataset>
index 18cb033a7eb2254a5df665e902142cb76fa258bb,0000000000000000000000000000000000000000..70016cc2d9dff208a5d5ac1e33223b82ec6b91aa
mode 100644,000000..100644
--- /dev/null
@@@ -1,7 -1,0 +1,9 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="USABILITY" name="Usability" parent_id="1" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
++  <characteristics id="2" kee="USABILITY" name="Usability" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +</dataset>
index 159e774bbf29b6ea00d8e89c865fa3b869b1bb04,0000000000000000000000000000000000000000..4f596203e6d5f465510ca6c41f00ee5986bc01ef
mode 100644,000000..100644
--- /dev/null
@@@ -1,26 -1,0 +1,30 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
 +<dataset>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2015-02-15" updated_at="[null]"/>
-   <characteristics id="4" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- New characteristic 'Usability' is on the top (order 1) -->
-   <characteristics id="5" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15" updated_at="[null]"/>
-   <characteristics id="6" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
-   <characteristics id="7" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="4" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
++  <characteristics id="5" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++                   updated_at="[null]"/>
++  <characteristics id="6" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +
 +  <!-- New sub characteristic 'Compliance' under Reusability -->
-   <characteristics id="8" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="2" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="7" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Portability -->
++  <characteristics id="8" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="2" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +</dataset>
index 1ce991c6bfff0b5305dbc0fbc40aa63f8029007c,0000000000000000000000000000000000000000..7ab9a9726acf7a933d5964976efbc4f99f249387
mode 100644,000000..100644
--- /dev/null
@@@ -1,7 -1,0 +1,9 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
++  <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +</dataset>
index 0a78e76bfd8f77d0766adc5f00be8cfafe9d74ce,0000000000000000000000000000000000000000..91f1c6ab778177a5c5520a7c400f3119b4e8dbdc
mode 100644,000000..100644
--- /dev/null
@@@ -1,65 -1,0 +1,74 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="4" kee="SECURITY" name="Security" parent_id="[null]" characteristic_order="4" 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="3" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="2013-11-22"/>
 +
-   <characteristics id="5" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="4" kee="SECURITY" name="Security" parent_id="[null]" rule_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="6" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="5" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" rule_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="7" kee="RELIABILITY" name="Reliability" parent_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="6" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" rule_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="8" kee="TESTABILITY" name="Testability" parent_id="[null]" characteristic_order="9" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="7" kee="RELIABILITY" name="Reliability" parent_id="[null]" rule_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="9" kee="USABILITY" name="Usability" parent_id="[null]" characteristic_order="5" enabled="[true]" created_at="2015-02-15" updated_at="[null]"/>
++  <characteristics id="8" kee="TESTABILITY" name="Testability" parent_id="[null]" rule_id="[null]" characteristic_order="9" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- New characteristic 'Usability' is after Security -->
-   <characteristics id="10" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="9" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="5" enabled="[true]" created_at="2015-02-15"
++                   updated_at="[null]"/>
 +  <!-- New sub characteristics under Usability -->
-   <characteristics id="11" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15" updated_at="[null]"/>
-   <characteristics id="12" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="9" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="10" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
-   <characteristics id="13" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="11" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
++  <characteristics id="12" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="9" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Reusability -->
-   <characteristics id="14" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="2" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="13" kee="REUSABILITY_COMPLIANCE" name="Reusability Compliance" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Portability -->
-   <characteristics id="15" kee="MAINTAINABILITY_COMPLIANCE" name="Maintainability Compliance" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="14" kee="PORTABILITY_COMPLIANCE" name="Portability Compliance" parent_id="2" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Maintainability -->
-   <characteristics id="16" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="4" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="15" kee="MAINTAINABILITY_COMPLIANCE" name="Maintainability Compliance" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Security -->
-   <characteristics id="17" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="5" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="16" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="4" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Efficiency -->
-   <characteristics id="18" kee="CHANGEABILITY_COMPLIANCE" name="Changeability Compliance" parent_id="6" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="17" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="5" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Changeability -->
-   <characteristics id="19" kee="RELIABILITY_COMPLIANCE" name="Reliability Compliance" parent_id="7" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="18" kee="CHANGEABILITY_COMPLIANCE" name="Changeability Compliance" parent_id="6" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Reliability -->
-   <characteristics id="20" kee="TESTABILITY_COMPLIANCE" name="Testability Compliance" parent_id="8" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="19" kee="RELIABILITY_COMPLIANCE" name="Reliability Compliance" parent_id="7" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Testability -->
++  <characteristics id="20" kee="TESTABILITY_COMPLIANCE" name="Testability Compliance" parent_id="8" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +</dataset>
index 10261289eff301b36ed5581e881f3e524ab263b3,0000000000000000000000000000000000000000..2d92c7cc413a59d6efbc29b5055ca8b2355b25cc
mode 100644,000000..100644
--- /dev/null
@@@ -1,20 -1,0 +1,27 @@@
-   <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="REUSABILITY" name="Reusability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="3" kee="MAINTAINABILITY" name="Maintainability" parent_id="[null]" characteristic_order="3" enabled="[true]" created_at="2013-11-20"
++  <characteristics id="2" kee="PORTABILITY" name="Portability" parent_id="[null]" rule_id="[null]" characteristic_order="2" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="4" kee="SECURITY" name="Security" parent_id="[null]" characteristic_order="4" 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="3" enabled="[true]" created_at="2013-11-20"
 +                   updated_at="2013-11-22"/>
 +
-   <characteristics id="5" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="4" kee="SECURITY" name="Security" parent_id="[null]" rule_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="6" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="5" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" rule_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="7" kee="RELIABILITY" name="Reliability" parent_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="6" kee="CHANGEABILITY" name="Changeability" parent_id="[null]" rule_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="8" kee="TESTABILITY" name="Testability" parent_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="7" kee="RELIABILITY" name="Reliability" parent_id="[null]" rule_id="[null]" characteristic_order="7" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
++  <characteristics id="8" kee="TESTABILITY" name="Testability" parent_id="[null]" rule_id="[null]" characteristic_order="8" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +</dataset>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6953f5230bb6f6427e95b03aced60877c0ad52b6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,14 @@@
++<dataset>
++
++  <characteristics id="1" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="1" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
++  <characteristics id="2" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++                   updated_at="[null]"/>
++  <characteristics id="3" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20"
++                   updated_at="[null]"/>
++  <characteristics id="4" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2013-11-20" updated_at="[null]"/>
++
++  <characteristics id="5" kee="[null]" name="[null]" parent_id="3" rule_id="3" characteristic_order="[null]" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++
++</dataset>
index 9afaa00825b077d2b2acd231e66c09a3c6b8699a,0000000000000000000000000000000000000000..98c025def6b245d5136244747b98ba8d0dcecc67
mode 100644,000000..100644
--- /dev/null
@@@ -1,10 -1,0 +1,11 @@@
 +CREATE TABLE "CHARACTERISTICS" (
 +  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
 +  "KEE" VARCHAR(100),
 +  "NAME" VARCHAR(100),
 +  "PARENT_ID" INTEGER,
++  "RULE_ID" INTEGER,
 +  "CHARACTERISTIC_ORDER" INTEGER,
 +  "ENABLED" BOOLEAN,
 +  "CREATED_AT" TIMESTAMP,
 +  "UPDATED_AT" TIMESTAMP
 +);
index c4073cba9bb027beef84dea3f08d79cd24827f7c,0000000000000000000000000000000000000000..1b12df0872e9f6f6ef3e843fb2d0d4ab77214e75
mode 100644,000000..100644
--- /dev/null
@@@ -1,26 -1,0 +1,30 @@@
-   <characteristics id="1" kee="SECURITY" name="Security" parent_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="1" kee="SECURITY" name="Security" parent_id="[null]" rule_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +  <!-- Oder has changed : this characteristic is now one step lower -->
-   <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20" updated_at="2015-02-15"/>
++  <characteristics id="2" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" rule_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- Usability is moved after Security -->
-   <characteristics id="4" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2015-02-15"/>
 +
 +  <!-- New sub characteristics under Usability -->
-   <characteristics id="5" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15" updated_at="[null]"/>
-   <characteristics id="6" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="3" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="4" kee="USABILITY_ACCESSIBILITY" name="Accessibility" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
-   <characteristics id="7" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="1" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
++  <characteristics id="5" kee="USABILITY_EASE_OF_USE" name="Ease of Use" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
++  <characteristics id="6" kee="USABILITY_COMPLIANCE" name="Usability Compliance" parent_id="3" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Security -->
-   <characteristics id="8" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="2" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
-                    updated_at="[null]"/>
++  <characteristics id="7" kee="SECURITY_COMPLIANCE" name="Security Compliance" parent_id="1" rule_id="[null]" characteristic_order="[null]" enabled="[true]" created_at="2015-02-15"
 +                   updated_at="[null]"/>
 +
 +  <!-- New sub characteristic 'Compliance' under Efficiency -->
++  <characteristics id="8" kee="EFFICIENCY_COMPLIANCE" name="Efficiency Compliance" parent_id="2" rule_id="[null]" characteristic_order="[null]" enabled="[true]"
++                   created_at="2015-02-15" updated_at="[null]"/>
 +
 +</dataset>
index 053038789139f3d09532ff7a8fd59f2fa8bdf328,0000000000000000000000000000000000000000..33d901de062c93ee0395215cc2d31c831a23952f
mode 100644,000000..100644
--- /dev/null
@@@ -1,10 -1,0 +1,13 @@@
-   <characteristics id="1" kee="SECURITY" name="Security" parent_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
 +<dataset>
 +
-   <characteristics id="2" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="1" kee="SECURITY" name="Security" parent_id="[null]" rule_id="[null]" characteristic_order="4" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
-   <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20" updated_at="2013-11-22"/>
++  <characteristics id="2" kee="EFFICIENCY" name="Efficiency" parent_id="[null]" rule_id="[null]" characteristic_order="5" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +  <!-- Usability should be move after Security -->
++  <characteristics id="3" kee="USABILITY" name="Usability" parent_id="[null]" rule_id="[null]" characteristic_order="6" enabled="[true]" created_at="2013-11-20"
++                   updated_at="2013-11-22"/>
 +
 +</dataset>