import org.sonar.api.internal.SonarRuntimeImpl;
import org.sonar.api.utils.Version;
import org.sonar.xoo.lang.CpdTokenizerSensor;
+import org.sonar.xoo.rule.OneExternalIssuePerLineSensor;
import static org.assertj.core.api.Assertions.assertThat;
SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse("7.2"), SonarQubeSide.SCANNER);
Plugin.Context context = new PluginContextImpl.Builder().setSonarRuntime(runtime).build();
new XooPlugin().define(context);
- assertThat(context.getExtensions()).hasSize(52).contains(CpdTokenizerSensor.class);
+ assertThat(context.getExtensions()).hasSize(52).contains(OneExternalIssuePerLineSensor.class);
}
}
"DESCRIPTION_FORMAT" VARCHAR(20),
"PRIORITY" INTEGER,
"IS_TEMPLATE" BOOLEAN DEFAULT FALSE,
- "IS_EXTERNAL" BOOLEAN DEFAULT FALSE,
+ "IS_EXTERNAL" BOOLEAN,
"TEMPLATE_ID" INTEGER,
"PLUGIN_CONFIG_KEY" VARCHAR(200),
"NAME" VARCHAR(200),
.setConfigKey("NewConfigKey")
.setSeverity(Severity.INFO)
.setIsTemplate(true)
- .setIsExternal(true)
.setLanguage("dart")
.setTemplateId(3)
.setDefRemediationFunction(DebtRemediationFunction.Type.LINEAR_OFFSET.toString())
assertThat(ruleDto.getSeverity()).isEqualTo(0);
assertThat(ruleDto.getLanguage()).isEqualTo("dart");
assertThat(ruleDto.isTemplate()).isTrue();
- assertThat(ruleDto.isExternal()).isTrue();
+ assertThat(ruleDto.isExternal()).isFalse();
assertThat(ruleDto.getTemplateId()).isEqualTo(3);
assertThat(ruleDto.getDefRemediationFunction()).isEqualTo("LINEAR_OFFSET");
assertThat(ruleDto.getDefRemediationGapMultiplier()).isEqualTo("5d");
assertThat(firstRule.getType()).isEqualTo(r1.getType());
assertThat(firstRule.getCreatedAt()).isEqualTo(r1.getCreatedAt());
assertThat(firstRule.getUpdatedAt()).isEqualTo(r1.getUpdatedAt());
-
+
RuleForIndexingDto secondRule = it.next();
assertThat(secondRule.isExternal()).isTrue();
-
+
}
@Test
.extracting(DeprecatedRuleKeyDto::getNewRepositoryKey, DeprecatedRuleKeyDto::getNewRuleKey)
.containsExactly(
tuple(null, null),
- tuple(null, null)
- );
+ tuple(null, null));
}
@Test
@Test
public void deleteDeprecatedRuleKeys() {
DeprecatedRuleKeyDto deprecatedRuleKeyDto1 = db.rules().insertDeprecatedKey();
- db.rules().insertDeprecatedKey();;
+ db.rules().insertDeprecatedKey();
assertThat(underTest.selectAllDeprecatedRuleKeys(db.getSession())).hasSize(2);
.addColumn(BooleanColumnDef.newBooleanColumnDefBuilder()
.setColumnName("is_external")
.setIsNullable(true)
- .setDefaultValue(false)
.build())
.build());
}
.add(2100, "Increase size of USERS.CRYPTED_PASSWORD", IncreaseCryptedPasswordSize.class)
.add(2101, "Add HASH_METHOD to table users", AddHashMethodToUsersTable.class)
.add(2102, "Populate HASH_METHOD on table users", PopulateHashMethodOnUsers.class)
- .add(2103, "Add isExternal boolean to rules", AddRuleExternal.class);
+ .add(2103, "Add isExternal boolean to rules", AddRuleExternal.class)
+ ;
}
}
private DbVersion72 underTest = new DbVersion72();
@Test
- public void migrationNumber_starts_at_2000() {
+ public void migrationNumber_starts_at_2100() {
verifyMinimumMigrationNumber(underTest, 2100);
}
package org.sonar.server.computation.task.projectanalysis.issue;
import java.util.Collections;
+import java.util.Objects;
import java.util.Set;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.rule.RuleKey;
private final String pluginKey;
private NewExternalRule(Builder builder) {
- this.key = checkNotNull(builder.key, "key");
+ Objects.requireNonNull(builder.key, "'key' not expected to be null for an external rule");
+ this.key = builder.key;
this.pluginKey = builder.pluginKey;
this.name = builder.name;
}
- private static <T> T checkNotNull(T obj, String name) {
- if (obj == null) {
- throw new IllegalStateException("'" + name + "' not expected to be null for an external rule");
- }
- return obj;
- }
-
@Override
public int getId() {
return 0;
RuleStatus getStatus();
+ /**
+ * Will be null for external rules
+ */
@CheckForNull
RuleType getType();
try (DbSession dbSession = dbClient.openSession(false)) {
ruleRepository.persistNewExternalRules(dbSession);
- dbSession.flushStatements();
- dbSession.commit();
}
}
@Test
public void fail_if_rule_key_is_not_set() {
- exception.expect(IllegalStateException.class);
+ exception.expect(NullPointerException.class);
exception.expectMessage("'key' not expected to be null for an external rule");
new NewExternalRule.Builder()
import org.sonar.server.computation.task.projectanalysis.issue.RuleRepositoryImpl;
import org.sonar.server.computation.task.projectanalysis.issue.UpdateConflictResolver;
import org.sonar.server.computation.task.step.ComputationStep;
-import org.sonar.server.es.EsTester;
import org.sonar.server.rule.ExternalRuleCreator;
import org.sonar.server.util.cache.DiskCache;
private IssueCache issueCache;
private ComputationStep step;
- @org.junit.Rule
- public EsTester es = EsTester.create();
-
private ExternalRuleCreator externalRuleCreator = mock(ExternalRuleCreator.class);
@Override
@Test
public void do_not_allow_transitions_for_issues_from_external_rule_engine() {
- expectedException.expect(IllegalArgumentException.class);
- expectedException.expectMessage("No transition allowed on issue from externally define rule");
-
loginAndAddProjectPermission("john", ISSUE_ADMIN);
context.issue()
.setIsFromExternalRuleEngine(true)
.setStatus(STATUS_CLOSED);
+ expectedException.expect(IllegalArgumentException.class);
+ expectedException.expectMessage("No transition allowed on issue from externally define rule");
action.execute(ImmutableMap.of("transition", "close"), context);
-
}
@Test
*/
List<IssueLocation> locations();
}
-
+
/**
* Effort to fix the issue. Used by technical debt model.
* @deprecated since 5.5 use {@link #gap()}
*/
@CheckForNull
Double gap();
-
+
/**
* Overridden severity.
*/
@CheckForNull
Severity overriddenSeverity();
-
+
/**
* Primary locations for this issue.
* @since 5.2