From a0ce661a8c0d6674efc9091a5f5ab404ad315bfa Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 31 Mar 2017 17:15:32 +0200 Subject: [PATCH] Add convenient methods to rule/issue testing utilities --- .../java/org/sonar/db/version/SqTables.java | 1 + .../java/org/sonar/db/issue/IssueDto.java | 7 +- .../java/org/sonar/db/issue/IssueTesting.java | 41 +++++-- .../main/java/org/sonar/db/rule/RuleDao.java | 2 +- .../java/org/sonar/db/issue/IssueDaoTest.java | 2 +- .../org/sonar/db/issue/IssueDbTester.java | 15 ++- .../java/org/sonar/db/issue/IssueDtoTest.java | 4 +- .../db/qualityprofile/ActiveRuleDaoTest.java | 8 +- .../java/org/sonar/db/rule/RuleDaoTest.java | 8 +- .../java/org/sonar/db/rule/RuleDbTester.java | 58 +++++++++- .../java/org/sonar/db/rule/RuleTesting.java | 108 ++++++++++++++---- .../org/sonar/server/rule/RuleCreator.java | 2 +- .../org/sonar/server/rule/RuleUpdater.java | 2 +- .../server/issue/IssueServiceMediumTest.java | 2 +- .../index/ActiveRuleIndexerTest.java | 4 +- .../sonar/server/rule/RegisterRulesTest.java | 2 +- .../server/rule/RuleCreatorMediumTest.java | 2 +- .../server/rule/RuleServiceMediumTest.java | 2 +- .../server/rule/RuleUpdaterMediumTest.java | 10 +- .../rule/ws/CreateActionMediumTest.java | 2 +- .../server/rule/ws/RulesWsMediumTest.java | 6 +- .../rule/ws/SearchActionMediumTest.java | 14 +-- .../server/rule/ws/ShowActionMediumTest.java | 10 +- .../rule/ws/UpdateActionMediumTest.java | 4 +- 24 files changed, 236 insertions(+), 80 deletions(-) diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java b/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java index 6c34930e32f..6bfd1a9a592 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java @@ -81,6 +81,7 @@ public final class SqTables { "properties", "qprofile_changes", "rules", + "rules_metadata", "rules_parameters", "rules_profiles", "rule_repositories", diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java index 8133ab289e2..497fd242901 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java @@ -42,6 +42,7 @@ import org.sonar.core.issue.DefaultIssue; import org.sonar.core.util.Uuids; import org.sonar.db.component.ComponentDto; import org.sonar.db.protobuf.DbIssues; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import static com.google.common.base.Preconditions.checkArgument; @@ -447,7 +448,7 @@ public final class IssueDto implements Serializable { return ruleKey; } - public IssueDto setRule(RuleDto rule) { + public IssueDto setRule(RuleDefinitionDto rule) { Preconditions.checkNotNull(rule.getId(), "Rule must be persisted."); this.ruleId = rule.getId(); this.ruleKey = rule.getRuleKey(); @@ -471,7 +472,7 @@ public final class IssueDto implements Serializable { /** * Should only be used to persist in E/S *

- * Please use {@link #setRule(RuleDto)} instead + * Please use {@link #setRule(RuleDefinitionDto)} instead */ public IssueDto setLanguage(String language) { this.language = language; @@ -590,7 +591,7 @@ public final class IssueDto implements Serializable { /** * Should only be used to persist in E/S *

- * Please use {@link #setRule(RuleDto)} instead + * Please use {@link #setRule(RuleDefinitionDto)} instead */ public IssueDto setRuleKey(String repo, String rule) { this.ruleRepo = repo; diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java index 33ff23722c4..a7dba82a210 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java @@ -19,32 +19,59 @@ */ package org.sonar.db.issue; +import java.util.Date; +import org.apache.commons.lang.math.RandomUtils; import org.sonar.api.issue.Issue; import org.sonar.api.rule.Severity; import org.sonar.api.rules.RuleType; import org.sonar.api.utils.DateUtils; import org.sonar.core.util.Uuids; import org.sonar.db.component.ComponentDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; +import static com.google.common.collect.Sets.newHashSet; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; +import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; +import static org.apache.commons.lang.math.RandomUtils.nextInt; + public class IssueTesting { private IssueTesting() { + // only statics + } + public static IssueDto newIssue(RuleDefinitionDto rule, ComponentDto project, ComponentDto file) { + return new IssueDto() + .setKee("uuid_" + randomAlphabetic(5)) + .setRule(rule) + .setType(RuleType.values()[nextInt(RuleType.values().length)]) + .setProject(project) + .setComponent(file) + .setStatus(Issue.STATUS_OPEN) + .setResolution(null) + .setSeverity(Severity.ALL.get(nextInt(Severity.ALL.size()))) + .setEffort((long) RandomUtils.nextInt(10)) + .setAssignee("assignee_" + randomAlphabetic(5)) + .setAuthorLogin("author_" + randomAlphabetic(5)) + .setLine(nextInt(1_000)) + .setMessage("message_" + randomAlphabetic(5)) + .setChecksum("checksum_" + randomAlphabetic(5)) + .setTags(newHashSet("tag_" + randomAlphanumeric(5), "tag_" + randomAlphanumeric(5))) + .setIssueCreationDate(new Date(System.currentTimeMillis() - 2_000)) + .setIssueUpdateDate(new Date(System.currentTimeMillis() - 1_500)) + .setCreatedAt(System.currentTimeMillis() - 1_000) + .setUpdatedAt(System.currentTimeMillis() - 500); } /** - * Full IssueDto used to feed database with fake data. Tests must not rely on the - * field contents declared here. They should override the fields they need to test, - * for example: - *

-   *   issueDao.insert(dbSession, IssueTesting.newDto(rule, file, project).setStatus(Issue.STATUS_RESOLVED).setResolution(Issue.RESOLUTION_FALSE_POSITIVE));
-   * 
+ * @deprecated use newIssue(...) */ + @Deprecated public static IssueDto newDto(RuleDto rule, ComponentDto file, ComponentDto project) { return new IssueDto() .setKee(Uuids.createFast()) - .setRule(rule) + .setRule(rule.getDefinition()) .setType(RuleType.CODE_SMELL) .setComponent(file) .setProject(project) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java index 1323982ceec..73647d7629c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDao.java @@ -126,7 +126,7 @@ public class RuleDao implements Dao { mapper(session).updateDefinition(dto); } - public void update(DbSession session, RuleMetadataDto dto) { + public void insertOrUpdate(DbSession session, RuleMetadataDto dto) { if (mapper(session).countMetadata(dto) > 0) { mapper(session).updateMetadata(dto); } else { diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java index 5efa3bc682c..75b5864f659 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java @@ -126,7 +126,7 @@ public class IssueDaoTest { IssueDto dto = new IssueDto(); dto.setComponent(new ComponentDto().setKey("struts:Action").setId(123L).setUuid("component-uuid")); dto.setProject(new ComponentDto().setKey("struts").setId(100L).setUuid("project-uuid")); - dto.setRule(RuleTesting.newDto(RuleKey.of("squid", "S001")).setId(200)); + dto.setRule(RuleTesting.newRule(RuleKey.of("squid", "S001")).setId(200)); dto.setKee(key); dto.setType(2); dto.setLine(500); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDbTester.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDbTester.java index 458a9077f61..bf36598077a 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDbTester.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDbTester.java @@ -27,11 +27,11 @@ import org.sonar.core.issue.FieldDiffs; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.issue.IssueTesting.newDto; -import static org.sonar.db.rule.RuleTesting.newRuleDto; public class IssueDbTester { @@ -41,6 +41,17 @@ public class IssueDbTester { this.db = db; } + public IssueDto insert(RuleDefinitionDto rule, ComponentDto project, ComponentDto file) { + IssueDto issue = IssueTesting.newIssue(rule, project, file); + return insertIssue(issue); + } + + public IssueDto insert(RuleDefinitionDto rule, ComponentDto project, ComponentDto file, Consumer populator) { + IssueDto issue = IssueTesting.newIssue(rule, project, file); + populator.accept(issue); + return insertIssue(issue); + } + public IssueDto insertIssue(IssueDto issueDto) { db.getDbClient().issueDao().insert(db.getSession(), issueDto); db.commit(); @@ -62,7 +73,7 @@ public class IssueDbTester { } public IssueDto insertIssue(OrganizationDto organizationDto, Consumer populateIssueDto) { - RuleDto rule = db.rules().insertRule(newRuleDto()); + RuleDto rule = db.rules().insertRule(organizationDto); ComponentDto project = db.components().insertProject(organizationDto); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issueDto = newDto(rule, file, project); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java index 94f7bed0d5b..e8568b23f51 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java @@ -30,7 +30,7 @@ import org.sonar.api.issue.Issue; import org.sonar.api.rules.RuleType; import org.sonar.api.utils.Duration; import org.sonar.core.issue.DefaultIssue; -import org.sonar.db.rule.RuleDto; +import org.sonar.db.rule.RuleDefinitionDto; import static org.assertj.core.api.Assertions.assertThat; @@ -116,7 +116,7 @@ public class IssueDtoTest { public void set_rule() { IssueDto dto = new IssueDto() .setKee("100") - .setRule(new RuleDto().setId(1).setRuleKey("AvoidCycle").setRepositoryKey("squid")) + .setRule(new RuleDefinitionDto().setId(1).setRuleKey("AvoidCycle").setRepositoryKey("squid")) .setLanguage("xoo"); assertThat(dto.getRuleId()).isEqualTo(1); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/ActiveRuleDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/ActiveRuleDaoTest.java index d8ac744163a..1fa89afb3eb 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/ActiveRuleDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/ActiveRuleDaoTest.java @@ -91,9 +91,9 @@ public class ActiveRuleDaoTest { dbClient.qualityProfileDao().insert(dbSession, profile1); dbClient.qualityProfileDao().insert(dbSession, profile2); - dbTester.rules().insertRule(rule1); - dbTester.rules().insertRule(rule2); - dbTester.rules().insertRule(rule3); + dbTester.rules().insert(rule1); + dbTester.rules().insert(rule2); + dbTester.rules().insert(rule3); rule1Param1 = new RuleParamDto() .setName("param1") @@ -201,7 +201,7 @@ public class ActiveRuleDaoTest { @Test public void select_by_profile_ignore_removed_rules() throws Exception { RuleDefinitionDto removedRule = RuleTesting.newDto(RuleKey.of("removed", "rule")).setStatus(RuleStatus.REMOVED).getDefinition(); - dbTester.rules().insertRule(removedRule); + dbTester.rules().insert(removedRule); ActiveRuleDto activeRule = createFor(profile1, removedRule).setSeverity(BLOCKER); underTest.insert(dbTester.getSession(), activeRule); dbSession.commit(); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java index 60616176066..39001ebfa4a 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDaoTest.java @@ -398,7 +398,7 @@ public class RuleDaoTest { dbTester.prepareDbUnit(getClass(), "update.xml"); String organizationUuid = "org-1"; - RuleMetadataDto ruleToUpdate = new RuleMetadataDto() + RuleMetadataDto metadataToUpdate = new RuleMetadataDto() .setRuleId(1) .setOrganizationUuid(organizationUuid) .setNoteData("My note") @@ -412,7 +412,7 @@ public class RuleDaoTest { .setCreatedAt(3_500_000_000_000L) .setUpdatedAt(4_000_000_000_000L); - underTest.update(dbTester.getSession(), ruleToUpdate); + underTest.insertOrUpdate(dbTester.getSession(), metadataToUpdate); dbTester.getSession().commit(); RuleDto ruleDto = underTest.selectOrFailByKey(dbTester.getSession(), organizationUuid, RuleKey.of("checkstyle", "AvoidNull")); @@ -468,7 +468,7 @@ public class RuleDaoTest { .setCreatedAt(6_500_000_000_000L) .setUpdatedAt(7_000_000_000_000L); - underTest.update(dbTester.getSession(), metadataV1); + underTest.insertOrUpdate(dbTester.getSession(), metadataV1); dbTester.commit(); assertThat(dbTester.countRowsOfTable("RULES_METADATA")).isEqualTo(1); @@ -501,7 +501,7 @@ public class RuleDaoTest { assertThat(ruleDto.getCreatedAt()).isEqualTo(3_500_000_000_000L); assertThat(ruleDto.getUpdatedAt()).isEqualTo(4_000_000_000_000L); - underTest.update(dbTester.getSession(), metadataV2); + underTest.insertOrUpdate(dbTester.getSession(), metadataV2); dbTester.commit(); ruleDto = underTest.selectOrFailByKey(dbTester.getSession(), organizationUuid, RuleKey.of("checkstyle", "AvoidNull")); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDbTester.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDbTester.java index 288c2f79338..2e5111ea4db 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDbTester.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDbTester.java @@ -22,6 +22,7 @@ package org.sonar.db.rule; import java.util.Arrays; import java.util.function.Consumer; import org.apache.commons.lang.RandomStringUtils; +import org.sonar.api.rule.RuleKey; import org.sonar.api.server.rule.RuleParamType; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; @@ -36,11 +37,58 @@ public class RuleDbTester { this.db = db; } - public RuleDefinitionDto insertRule(RuleDefinitionDto ruleDto) { - RuleDao ruleDao = db.getDbClient().ruleDao(); - ruleDao.insert(db.getSession(), ruleDto); + public RuleDefinitionDto insert() { + return insert(RuleTesting.newRule()); + } + + public RuleDefinitionDto insert(RuleKey key) { + return insert(RuleTesting.newRule(key)); + } + + public RuleDefinitionDto insert(Consumer populater) { + RuleDefinitionDto rule = RuleTesting.newRule(); + populater.accept(rule); + return insert(rule); + } + + public RuleDefinitionDto insert(RuleKey key, Consumer populater) { + RuleDefinitionDto rule = RuleTesting.newRule(key); + populater.accept(rule); + return insert(rule); + } + + public RuleDefinitionDto insert(RuleDefinitionDto rule) { + db.getDbClient().ruleDao().insert(db.getSession(), rule); db.commit(); - return ruleDto; + return rule; + } + + public RuleMetadataDto insertOrUpdateMetadata(RuleDefinitionDto rule, OrganizationDto organization) { + return insertOrUpdateMetadata(rule, organization, r -> {}); + } + + public RuleMetadataDto insertOrUpdateMetadata(RuleDefinitionDto rule, OrganizationDto organization, Consumer populater) { + RuleMetadataDto dto = RuleTesting.newRuleMetadata(rule, organization); + populater.accept(dto); + return insertOrUpdateMetadata(dto); + } + + public RuleMetadataDto insertOrUpdateMetadata(RuleMetadataDto metadata) { + db.getDbClient().ruleDao().insertOrUpdate(db.getSession(), metadata); + db.commit(); + return metadata; + } + + public RuleParamDto insertRuleParam(RuleDefinitionDto rule) { + return insertRuleParam(rule, p -> {}); + } + + public RuleParamDto insertRuleParam(RuleDefinitionDto rule, Consumer populater) { + RuleParamDto param = RuleTesting.newRuleParam(rule); + populater.accept(param); + db.getDbClient().ruleDao().insertRuleParam(db.getSession(), rule, param); + db.commit(); + return param; } public RuleDto insertRule(RuleDto ruleDto) { @@ -49,7 +97,7 @@ public class RuleDbTester { db.commit(); RuleMetadataDto metadata = ruleDto.getMetadata(); if (metadata.getOrganizationUuid() != null) { - ruleDao.update(db.getSession(), metadata.setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(db.getSession(), metadata.setRuleId(ruleDto.getId())); db.commit(); } return ruleDto; diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleTesting.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleTesting.java index e4265a20095..2720a2635c3 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleTesting.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleTesting.java @@ -26,12 +26,16 @@ import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.api.rules.RuleType; +import org.sonar.api.server.rule.RuleParamType; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDto.Format; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Sets.newHashSet; import static java.util.Objects.requireNonNull; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; +import static org.apache.commons.lang.math.RandomUtils.nextInt; /** * Utility class for tests involving rules @@ -46,60 +50,123 @@ public class RuleTesting { // only static helpers } + public static RuleDefinitionDto newRule() { + return newRule(randomRuleKey()); + } + + public static RuleDefinitionDto newRule(RuleKey key) { + return new RuleDefinitionDto() + .setRepositoryKey(key.repository()) + .setRuleKey(key.rule()) + .setName("name_" + randomAlphanumeric(5)) + .setDescription("description_" + randomAlphanumeric(5)) + .setDescriptionFormat(Format.HTML) + .setType(RuleType.values()[nextInt(RuleType.values().length)]) + .setStatus(RuleStatus.READY) + .setConfigKey("configKey_" + randomAlphanumeric(5)) + .setSeverity(Severity.ALL.get(nextInt(Severity.ALL.size()))) + .setIsTemplate(false) + .setSystemTags(newHashSet("tag_" + randomAlphanumeric(5), "tag_" + randomAlphanumeric(5))) + .setLanguage("lang_" + randomAlphanumeric(3)) + .setGapDescription("gapDescription_" + randomAlphanumeric(5)) + .setDefRemediationBaseEffort(nextInt(10) + "h") + .setDefRemediationGapMultiplier(nextInt(10) + "h") + .setDefRemediationFunction("LINEAR_OFFSET") + .setCreatedAt(System.currentTimeMillis()) + .setUpdatedAt(System.currentTimeMillis()); + } + + public static RuleMetadataDto newRuleMetadata() { + return new RuleMetadataDto() + .setRuleId(nextInt(100_000)) + .setOrganizationUuid("org_" + randomAlphanumeric(5)) + .setRemediationBaseEffort(nextInt(10) + "h") + .setRemediationGapMultiplier(nextInt(10) + "h") + .setRemediationFunction("LINEAR_OFFSET") + .setTags(newHashSet("tag_" + randomAlphanumeric(5), "tag_" + randomAlphanumeric(5))) + .setNoteData("noteData_" + randomAlphanumeric(5)) + .setNoteUserLogin("noteLogin_" + randomAlphanumeric(5)) + .setNoteCreatedAt(System.currentTimeMillis() - 200) + .setNoteUpdatedAt(System.currentTimeMillis() - 150) + .setCreatedAt(System.currentTimeMillis() - 100) + .setUpdatedAt(System.currentTimeMillis() - 50); + } + + public static RuleMetadataDto newRuleMetadata(RuleDefinitionDto rule, OrganizationDto organization) { + return newRuleMetadata() + .setRuleId(rule.getId()) + .setOrganizationUuid(organization.getUuid()); + } + + public static RuleParamDto newRuleParam(RuleDefinitionDto rule) { + return new RuleParamDto() + .setRuleId(rule.getId()) + .setName("name_" + randomAlphabetic(5)) + .setDefaultValue("default_" + randomAlphabetic(5)) + .setDescription("description_" + randomAlphabetic(5)) + .setType(RuleParamType.STRING.type()); + } + /** - * Create a RuleDto representing the definition of the rule Xoo1 of language Xoo. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX1() { return newDto(XOO_X1).setLanguage("xoo"); } /** - * Create a RuleDto representing the definition of the rule Xoo1 of language Xoo with some user defined fields. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX1(OrganizationDto organization) { return newDto(XOO_X1, requireNonNull(organization, "organization can't be null")).setLanguage("xoo"); } /** - * Create a RuleDto representing the definition of the rule Xoo2 of language Xoo. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX2() { return newDto(XOO_X2).setLanguage("xoo"); } /** - * Create a RuleDto representing the definition of the rule Xoo2 of language Xoo with some user defined fields. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX2(OrganizationDto organization) { return newDto(XOO_X2, requireNonNull(organization, "organization can't be null")).setLanguage("xoo"); } /** - * Create a RuleDto representing the definition of the rule Xoo3 of language Xoo. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX3() { return newDto(XOO_X3).setLanguage("xoo"); } /** - * Create a RuleDto representing the definition of the rule Xoo3 of language Xoo with some user defined fields. + * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newXooX3(OrganizationDto organization) { return newDto(XOO_X3, requireNonNull(organization, "organization can't be null")).setLanguage("xoo"); } /** - * Full RuleDto used to feed database with fake data. Tests must not rely on the - * field contents declared here. They should override the fields they need to test, - * for example: - *
-   *   ruleDao.insert(dbSession, RuleTesting.newDto(key).setStatus(RuleStatus.BETA));
-   * 
+ * @deprecated use newRule(...) */ + @Deprecated public static RuleDto newDto(RuleKey ruleKey) { return newDto(ruleKey, null); } + /** + * @deprecated use newRule(...) + */ + @Deprecated public static RuleDto newDto(RuleKey ruleKey, @Nullable OrganizationDto organization) { RuleDto res = new RuleDto() .setRuleKey(ruleKey.rule()) @@ -130,26 +197,27 @@ public class RuleTesting { return res; } + /** + * @deprecated use newRule(...) + */ + @Deprecated public static RuleDto newRuleDto() { return newDto(RuleKey.of(randomAlphanumeric(30), randomAlphanumeric(30))); } - + /** + * @deprecated use newRule(...) + */ + @Deprecated public static RuleDto newRuleDto(OrganizationDto organization) { return newDto(RuleKey.of(randomAlphanumeric(30), randomAlphanumeric(30)), organization); } - /** - * Creates a new rule to be used as a template for a custom rule. - */ public static RuleDto newTemplateRule(RuleKey ruleKey) { return newDto(ruleKey) .setIsTemplate(true); } - /** - * Creates a new rule to be used as a template for a custom rule with some user defined fields. - */ public static RuleDto newTemplateRule(RuleKey ruleKey, OrganizationDto organization) { return newDto(ruleKey, organization) .setIsTemplate(true); @@ -164,6 +232,6 @@ public class RuleTesting { } public static RuleKey randomRuleKey() { - return RuleKey.of(randomAlphanumeric(5), randomAlphanumeric(5)); + return RuleKey.of("repo_" + randomAlphanumeric(3), "rule_" + randomAlphanumeric(3)); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java index 8b1f4fb51c2..1cd31f7d345 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleCreator.java @@ -183,7 +183,7 @@ public class RuleCreator { .setTags(tags) .setCreatedAt(system2.now()) .setUpdatedAt(system2.now()); - dbClient.ruleDao().update(dbSession, ruleMetadata); + dbClient.ruleDao().insertOrUpdate(dbSession, ruleMetadata); } for (RuleParamDto templateRuleParamDto : dbClient.ruleDao().selectRuleParamsByRuleKey(dbSession, templateRuleDto.getKey())) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java index 16bdf32f2aa..1dc61bd387b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java @@ -348,7 +348,7 @@ public class RuleUpdater { private void update(DbSession session, RuleDto rule) { rule.setUpdatedAt(system.now()); dbClient.ruleDao().update(session, rule.getDefinition()); - dbClient.ruleDao().update(session, rule.getMetadata()); + dbClient.ruleDao().insertOrUpdate(session, rule.getMetadata()); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java index 8b33a9e790a..28f9f3343ca 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java @@ -183,7 +183,7 @@ public class IssueServiceMediumTest { RuleDao ruleDao = tester.get(RuleDao.class); ruleDao.insert(session, rule.getDefinition()); if (rule.getOrganizationUuid() != null) { - ruleDao.update(session, rule.getMetadata().setRuleId(rule.getId())); + ruleDao.insertOrUpdate(session, rule.getMetadata().setRuleId(rule.getId())); } session.commit(); ruleIndexer.index(organization, rule.getKey()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java index 7caba2b318c..437810a98b6 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/index/ActiveRuleIndexerTest.java @@ -143,7 +143,7 @@ public class ActiveRuleIndexerTest { // Index one active rule RuleDefinitionDto rule = RuleTesting.newDto(RULE_KEY_1).getDefinition(); - dbTester.rules().insertRule(rule); + dbTester.rules().insert(rule); QualityProfileDto profile = QualityProfileDto.createFor("qp") .setOrganizationUuid(organization.getUuid()) .setLanguage("xoo") @@ -160,7 +160,7 @@ public class ActiveRuleIndexerTest { // Index another active rule RuleDefinitionDto rule2 = RuleTesting.newDto(RULE_KEY_2).getDefinition(); - dbTester.rules().insertRule(rule2); + dbTester.rules().insert(rule2); ActiveRuleDto activeRule2 = ActiveRuleDto.createFor(profile, rule2).setSeverity(Severity.CRITICAL) .setCreatedAt(now).setUpdatedAt(now); dbTester.getDbClient().activeRuleDao().insert(dbTester.getSession(), activeRule2); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index cb71bb9ad35..11ed26165b7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -190,7 +190,7 @@ public class RegisterRulesTest { rule1.setTags(newHashSet("usertag1", "usertag2")); rule1.setNoteData("user *note*"); rule1.setNoteUserLogin("marius"); - dbClient.ruleDao().update(dbTester.getSession(), rule1.getMetadata()); + dbClient.ruleDao().insertOrUpdate(dbTester.getSession(), rule1.getMetadata()); dbTester.getSession().commit(); when(system.now()).thenReturn(DATE2.getTime()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java index 8b161cf3625..c61670e5dbe 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java @@ -515,7 +515,7 @@ public class RuleCreatorMediumTest { .setCreatedAt(new Date().getTime()) .setUpdatedAt(new Date().getTime()); dao.insert(dbSession, templateRule.getDefinition()); - dao.update(dbSession, templateRule.getMetadata().setRuleId(templateRule.getId())); + dao.insertOrUpdate(dbSession, templateRule.getMetadata().setRuleId(templateRule.getId())); RuleParamDto ruleParamDto = RuleParamDto.createFor(templateRule.getDefinition()).setName("regex").setType("STRING").setDescription("Reg ex").setDefaultValue(".*"); dao.insertRuleParam(dbSession, templateRule.getDefinition(), ruleParamDto); dbSession.commit(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleServiceMediumTest.java index e755c0751b6..e2cc174e80f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleServiceMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleServiceMediumTest.java @@ -116,7 +116,7 @@ public class RuleServiceMediumTest { private void insertRule(RuleKey key, Set tags, Set systemTags) { RuleDto ruleDto = RuleTesting.newDto(key, defaultOrganization).setTags(tags).setSystemTags(systemTags); dao.insert(dbSession, ruleDto.getDefinition()); - dao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + dao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); ruleIndexer.index(defaultOrganization, ruleDto.getKey()); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java index bc47da0e904..c32def434dd 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java @@ -118,7 +118,7 @@ public class RuleUpdaterMediumTest { .setRemediationGapMultiplier("1d") .setRemediationBaseEffort("5min"); ruleDao.insert(dbSession, ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY); @@ -149,7 +149,7 @@ public class RuleUpdaterMediumTest { .setRemediationGapMultiplier("1d") .setRemediationBaseEffort("5min"); ruleDao.insert(dbSession, ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY); @@ -175,7 +175,7 @@ public class RuleUpdaterMediumTest { .setNoteData("my *note*") .setNoteUserLogin("me"); ruleDao.insert(dbSession, ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setMarkdownNote(null); @@ -217,7 +217,7 @@ public class RuleUpdaterMediumTest { .setTags(Sets.newHashSet("security")) .setSystemTags(Sets.newHashSet("java8", "javadoc")); ruleDao.insert(dbSession, ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata()); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata()); dbSession.commit(); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setTags(null); @@ -319,7 +319,7 @@ public class RuleUpdaterMediumTest { .setRemediationGapMultiplier(null) .setRemediationBaseEffort("1min"); ruleDao.insert(dbSession, ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setDebtRemediationFunction(null); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/CreateActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/CreateActionMediumTest.java index 91ee1207521..0ea475f6054 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/CreateActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/CreateActionMediumTest.java @@ -77,7 +77,7 @@ public class CreateActionMediumTest { // Template rule RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001"), defaultOrganization); ruleDao.insert(session, templateRule.getDefinition()); - ruleDao.update(session, templateRule.getMetadata().setRuleId(templateRule.getId())); + ruleDao.insertOrUpdate(session, templateRule.getMetadata().setRuleId(templateRule.getId())); RuleParamDto param = RuleParamDto.createFor(templateRule.getDefinition()).setName("regex").setType("STRING").setDescription("Reg ex").setDefaultValue(".*"); ruleDao.insertRuleParam(session, templateRule.getDefinition(), param); session.commit(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsMediumTest.java index f9933742df9..509b8a59f93 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWsMediumTest.java @@ -114,7 +114,7 @@ public class RulesWsMediumTest { RuleDto rule = RuleTesting.newXooX1(defaultOrganization); ruleDao.insert(session, rule.getDefinition()); - ruleDao.update(session, rule.getMetadata().setRuleId(rule.getId())); + ruleDao.insertOrUpdate(session, rule.getMetadata().setRuleId(rule.getId())); ActiveRuleDto activeRuleDto = ActiveRuleDto.createFor(profile, rule.getDefinition()).setSeverity("BLOCKER"); tester.get(ActiveRuleDao.class).insert(session, activeRuleDto); @@ -146,13 +146,13 @@ public class RulesWsMediumTest { .setTags(ImmutableSet.of("hello", "world")) .setSystemTags(Collections.emptySet()); ruleDao.insert(session, rule.getDefinition()); - ruleDao.update(session, rule.getMetadata().setRuleId(rule.getId())); + ruleDao.insertOrUpdate(session, rule.getMetadata().setRuleId(rule.getId())); RuleDto rule2 = RuleTesting.newXooX2(defaultOrganization) .setTags(ImmutableSet.of("hello", "java")) .setSystemTags(ImmutableSet.of("sys1")); ruleDao.insert(session, rule2.getDefinition()); - ruleDao.update(session, rule2.getMetadata().setRuleId(rule2.getId())); + ruleDao.insertOrUpdate(session, rule2.getMetadata().setRuleId(rule2.getId())); session.commit(); ruleIndexer.index(defaultOrganization, Stream.of(rule, rule2).map(RuleDto::getKey).collect(Collectors.toList())); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java index 16e7a79546f..de5a39d883b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/SearchActionMediumTest.java @@ -133,11 +133,11 @@ public class SearchActionMediumTest { RuleDto rule1 = RuleTesting.newXooX1(defaultOrganizationDto) .setType(RuleType.BUG); insertRule(rule1.getDefinition()); - ruleDao.update(dbSession, rule1.getMetadata().setRuleId(rule1.getId())); + ruleDao.insertOrUpdate(dbSession, rule1.getMetadata().setRuleId(rule1.getId())); RuleDto rule2 = RuleTesting.newXooX2(defaultOrganizationDto) .setType(RuleType.VULNERABILITY); insertRule(rule2.getDefinition()); - ruleDao.update(dbSession, rule2.getMetadata().setRuleId(rule2.getId())); + ruleDao.insertOrUpdate(dbSession, rule2.getMetadata().setRuleId(rule2.getId())); dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); @@ -228,7 +228,7 @@ public class SearchActionMediumTest { .setRemediationGapMultiplier("2h") .setRemediationBaseEffort("25min"); insertRule(ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); @@ -247,7 +247,7 @@ public class SearchActionMediumTest { .setRemediationGapMultiplier(null) .setRemediationBaseEffort("5min"); insertRule(ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); @@ -266,7 +266,7 @@ public class SearchActionMediumTest { .setRemediationGapMultiplier("1h") .setRemediationBaseEffort(null); insertRule(ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD); @@ -484,7 +484,7 @@ public class SearchActionMediumTest { tester.get(QualityProfileDao.class).insert(dbSession, profile); RuleDto rule = RuleTesting.newXooX1(defaultOrganizationDto).setNoteData("this is *bold*"); insertRule(rule.getDefinition()); - ruleDao.update(dbSession, rule.getMetadata().setRuleId(rule.getId())); + ruleDao.insertOrUpdate(dbSession, rule.getMetadata().setRuleId(rule.getId())); dbSession.commit(); @@ -620,7 +620,7 @@ public class SearchActionMediumTest { .setRemediationGapMultiplier("2h") .setRemediationBaseEffort("25min"); insertRule(ruleDto.getDefinition()); - ruleDao.update(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(dbSession, ruleDto.getMetadata().setRuleId(ruleDto.getId())); dbSession.commit(); WsTester.TestRequest request = tester.wsTester() diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java index 491dd4ad9c9..4d4f348bd88 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java @@ -102,7 +102,7 @@ public class ShowActionMediumTest { .setType(RuleType.BUG); RuleDefinitionDto definition = ruleDto.getDefinition(); ruleDao.insert(session, definition); - ruleDao.update(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); RuleParamDto param = RuleParamDto.createFor(definition).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); ruleDao.insertRuleParam(session, definition, param); session.commit(); @@ -129,7 +129,7 @@ public class ShowActionMediumTest { .setRemediationGapMultiplier(null) .setRemediationBaseEffort(null); ruleDao.insert(session, ruleDto.getDefinition()); - ruleDao.update(session, ruleDto.getMetadata()); + ruleDao.insertOrUpdate(session, ruleDto.getMetadata()); session.commit(); session.clearCache(); @@ -156,7 +156,7 @@ public class ShowActionMediumTest { .setRemediationGapMultiplier("5d") .setRemediationBaseEffort("10h"); ruleDao.insert(session, ruleDto.getDefinition()); - ruleDao.update(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); session.commit(); session.clearCache(); @@ -181,7 +181,7 @@ public class ShowActionMediumTest { .setRemediationGapMultiplier("5d") .setRemediationBaseEffort("10h"); ruleDao.insert(session, ruleDto.getDefinition()); - ruleDao.update(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); session.commit(); session.clearCache(); @@ -249,7 +249,7 @@ public class ShowActionMediumTest { .setRemediationGapMultiplier("5d") .setRemediationBaseEffort("10h"); ruleDao.insert(session, ruleDto.getDefinition()); - ruleDao.update(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); + ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); session.commit(); WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/UpdateActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/UpdateActionMediumTest.java index 73c344a0fb3..0855625a0c4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/UpdateActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/UpdateActionMediumTest.java @@ -111,7 +111,7 @@ public class UpdateActionMediumTest { .setRemediationGapMultiplier("15min") .setRemediationBaseEffort("3h"); ruleDao.insert(session, rule.getDefinition()); - ruleDao.update(session, rule.getMetadata().setRuleId(rule.getId())); + ruleDao.insertOrUpdate(session, rule.getMetadata().setRuleId(rule.getId())); session.commit(); WsTester.TestRequest request = wsTester.newPostRequest("api/rules", "update") @@ -128,7 +128,7 @@ public class UpdateActionMediumTest { RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001"), defaultOrganization); RuleDefinitionDto definition = templateRule.getDefinition(); ruleDao.insert(session, definition); - ruleDao.update(session, templateRule.getMetadata().setRuleId(templateRule.getId())); + ruleDao.insertOrUpdate(session, templateRule.getMetadata().setRuleId(templateRule.getId())); RuleParamDto param = RuleParamDto.createFor(definition).setName("regex").setType("STRING").setDescription("Reg ex").setDefaultValue(".*"); ruleDao.insertRuleParam(session, definition, param); session.commit(); -- 2.39.5