/** * Loads descriptions of rules and related rule parameters. Existing descriptions * are overridden if English labels exist in bundles. */ public void load(RulesDefinition.NewRepository repo) { for (RulesDefinition.NewRule rule : repo.rules()) { String name = i18n.getName(repo.key(), rule.key()); if (StringUtils.isNotBlank(name)) { rule.setName(name); } String desc = i18n.getDescription(repo.key(), rule.key()); if (StringUtils.isNotBlank(desc)) { rule.setHtmlDescription(desc); } for (RulesDefinition.NewParam param : rule.params()) { String paramDesc = i18n.getParamDescription(repo.key(), rule.key(), param.key()); if (StringUtils.isNotBlank(paramDesc)) { param.setDescription(paramDesc); } } } } }
public void addHtmlDescription(NewRule rule) { URL resource = ExternalDescriptionLoader.class.getResource(resourceBasePath + "/" + rule.key() + ".html"); if (resource != null) { addHtmlDescription(rule, resource); } }
private void setDefaultActivation(NewRule rule) { if (activatedByDefault.contains(rule.key())) { // We should NOT call setActivatedByDefault if no default profile was provided: // this is how plugins should use this class when the runtime version of SQ does not support setActivatedByDefault rule.setActivatedByDefault(true); } }
@Override public void define(Context context) { NewRepository repository = context.createRepository(repositoryKey(), "php").setName("MyCompany Custom Repository"); // Load rule meta data from annotations RulesDefinitionAnnotationLoader annotationLoader = new RulesDefinitionAnnotationLoader(); checkClasses().forEach(ruleClass -> annotationLoader.load(repository, ruleClass)); // Optionally override html description from annotation with content from html files repository.rules().forEach(rule -> rule.setHtmlDescription(loadResource("/org/sonar/l10n/php/rules/custom/" + rule.key() + ".html"))); // Optionally define remediation costs Map<String, String> remediationCosts = new HashMap<>(); remediationCosts.put(ForbiddenFunctionUseCheck.KEY, "5min"); remediationCosts.put(OtherForbiddenFunctionUseCheck.KEY, "5min"); repository.rules().forEach(rule -> rule.setDebtRemediationFunction( rule.debtRemediationFunctions().constantPerIssue(remediationCosts.get(rule.key())))); repository.done(); }
private void createWarningRule(NewRepository repository, String ruleKey, String name, String remediationCost, Priority priority, String[] tags) { NewRule warning = repository.createRule(ruleKey).setName(name).setSeverity(priority.name()); warning.setTags(tags); warning.setDebtRemediationFunction(warning.debtRemediationFunctions().constantPerIssue(remediationCost)); warning.setType(RuleType.CODE_SMELL); warning.setHtmlDescription(getClass().getResource( String.format(HTML_DOC_PATH, Constants.LANGUAGE_KEY, Constants.STD_REPOSITORY_KEY, warning.key()))); } }
public void addHtmlDescription(RulesDefinition.NewRule rule) { URL resource = ExternalDescriptionLoader.class.getResource(resourceBasePath + "/" + rule.key() + ".html"); if (resource != null) { addHtmlDescription(rule, resource); } }
public void addHtmlDescription(NewRule rule) { URL resource = CustomAnnotationBasedRulesDefinition.class.getResource(externalDescriptionBasePath + "/" + rule.key() + ".html"); if (resource != null) { addHtmlDescription(rule, resource); } }
@Override public void define(Context context) { NewRepository repository = context .createRepository(CheckList.REPOSITORY_KEY, Python.KEY) .setName(REPOSITORY_NAME); getRuleMetadataLoader().addRulesByAnnotatedClass(repository, getCheckClasses()); repository.rules().stream() .filter(rule -> TEMPLATE_RULE_KEYS.contains(rule.key())) .forEach(rule -> rule.setTemplate(true)); repository.done(); }
private static void defineRemediationFunction(NewRepository repository) { Map<String, String> remediationCostMap = loadRemediationCostMap(); for (NewRule rule : repository.rules()) { String gap = remediationCostMap.get(rule.key()); if (gap == null) { throw new IllegalStateException("Missing remediation cost for rule " + rule.key()); } else if (!gap.equals("null")) { rule.setDebtRemediationFunction(rule.debtRemediationFunctions().linear(gap)); } } }
@Override public void define(Context context) { RulesDefinition.NewRepository repository = context.createRepository(repositoryKey(), "js") .setName("MyCompany Custom Repository"); // this will load metadata from @Rule annotation new RulesDefinitionAnnotationLoader().load(repository, checkClasses().toArray(new Class[] {})); NewRule rule = repository.rule("S1"); // description is loaded from html file in resources directory rule.setHtmlDescription(loadRuleDescription(rule.key())); // remediation function sets how much rule violation contributes to technical debt rule.setDebtRemediationFunction(rule.debtRemediationFunctions().linear("5min")); repository.done(); }
private static void defineRemediationFunction(NewRepository repository) { Map<String, String> remediationCostMap = loadRemediationCostMap(); for (NewRule rule : repository.rules()) { String gap = remediationCostMap.get(rule.key()); if (gap == null) { throw new IllegalStateException("Missing remediation cost for rule " + rule.key()); } else if (!gap.equals("null")) { rule.setDebtRemediationFunction(rule.debtRemediationFunctions().linear(gap)); } } }
public void addHtmlDescription(NewRule rule, Class<?> clz) { URL resource = clz.getResource(resourceBasePath + "/" + rule.key() + ".html"); if (resource != null) { addHtmlDescription(rule, resource); } }
private static void addRemediationCost(Collection<NewRule> rules) { Map<String, String> costByRule = getCostByRule(); for (NewRule newRule : rules) { String ruleKey = newRule.key(); if (costByRule.containsKey(ruleKey)) { DebtRemediationFunction linear = newRule.debtRemediationFunctions().linear(costByRule.get(ruleKey)); newRule.setDebtRemediationFunction(linear); } } }
private static void addRemediationCost(Collection<NewRule> rules) { Map<String, String> costByRule = getCostByRule(); for (NewRule newRule : rules) { String ruleKey = newRule.key(); if (costByRule.containsKey(ruleKey)) { DebtRemediationFunction linear = newRule.debtRemediationFunctions().linear(costByRule.get(ruleKey)); newRule.setDebtRemediationFunction(linear); } } }
private void ruleMetadata(NewRule rule) { String metadataKey = rule.key(); addHtmlDescription(rule, metadataKey); addMetadata(rule, metadataKey); }
public void addHtmlDescription(NewRule rule, Class<?> clz) { URL resource = clz.getResource(resourceBasePath + "/" + rule.key() + ".html"); if (resource != null) { addHtmlDescription(rule, resource); } }
private String ruleMetadata(Class<?> ruleClass, NewRule rule) { String metadataKey = rule.key(); org.sonar.java.RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(ruleClass, org.sonar.java.RspecKey.class); if (rspecKeyAnnotation != null) { metadataKey = rspecKeyAnnotation.value(); rule.setInternalKey(metadataKey); } addHtmlDescription(rule, metadataKey); addMetadata(rule, metadataKey); return metadataKey; }
@Override public void define(Context context) { NewRepository repository = context .createRepository(CheckList.REPOSITORY_KEY, Python.KEY) .setName(REPOSITORY_NAME); getRuleMetadataLoader().addRulesByAnnotatedClass(repository, getCheckClasses()); repository.rules().stream() .filter(rule -> TEMPLATE_RULE_KEYS.contains(rule.key())) .forEach(rule -> rule.setTemplate(true)); repository.done(); }
private void setDescriptionFromHtml(NewRule rule) { String htmlPath = resourceFolder + RESOURCE_SEP + rule.key() + ".html"; String description; try { description = Resources.toString(htmlPath, UTF_8); } catch (IOException e) { throw new IllegalStateException("Can't read resource: " + htmlPath, e); } rule.setHtmlDescription(description); }
private static String rspecKey(Class<?> ruleClass, NewRule rule) { org.sonar.java.RspecKey rspecKeyAnnotation = AnnotationUtils.getAnnotation(ruleClass, org.sonar.java.RspecKey.class); if (rspecKeyAnnotation != null) { String rspecKey = rspecKeyAnnotation.value(); rule.setInternalKey(rspecKey); return rspecKey; } else { return rule.key(); } }