public boolean doTransition(DefaultIssue defaultIssue, IssueChangeContext issueChangeContext, String transitionKey) { checkArgument(!defaultIssue.isFromExternalRuleEngine(), "Transition is not allowed on issues imported from external rule engines"); return workflow.doManualTransition(defaultIssue, transitionKey, issueChangeContext); }
public List<Transition> listTransitions(DefaultIssue issue) { if (issue.isFromExternalRuleEngine()){ return Collections.emptyList(); } String projectUuid = requireNonNull(issue.projectUuid()); return workflow.outTransitions(issue) .stream() .filter(transition -> (userSession.isLoggedIn() && isBlank(transition.requiredProjectPermission())) || userSession.hasComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)) .collect(MoreCollectors.toList()); }
private void setType(DefaultIssue issue) { if (!issue.isFromExternalRuleEngine()) { Rule rule = ruleRepository.getByKey(issue.ruleKey()); issue.setType(rule.getType()); } issue.setIsFromHotspot(issue.type() == RuleType.SECURITY_HOTSPOT); }
public void initNewOpenIssue(DefaultIssue issue) { Preconditions.checkArgument(issue.isFromExternalRuleEngine() != (issue.type() == null), "At this stage issue type should be set for and only for external issues"); issue.setKey(Uuids.create()); issue.setCreationDate(changeContext.date()); issue.setUpdateDate(changeContext.date()); issue.setStatus(Issue.STATUS_OPEN); issue.setEffort(debtCalculator.calculate(issue)); setType(issue); }
@CheckForNull public Duration calculate(DefaultIssue issue) { if (issue.isFromExternalRuleEngine()) { return issue.effort(); } Rule rule = ruleRepository.getByKey(issue.ruleKey()); DebtRemediationFunction fn = rule.getRemediationFunction(); if (fn != null) { verifyEffortToFix(issue, fn); Duration debt = Duration.create(0); String gapMultiplier = fn.gapMultiplier(); if (fn.type().usesGapMultiplier() && !Strings.isNullOrEmpty(gapMultiplier)) { int effortToFixValue = MoreObjects.firstNonNull(issue.gap(), 1).intValue(); // TODO convert to Duration directly in Rule#remediationFunction -> better performance + error handling debt = durations.decode(gapMultiplier).multiply(effortToFixValue); } String baseEffort = fn.baseEffort(); if (fn.type().usesBaseEffort() && !Strings.isNullOrEmpty(baseEffort)) { // TODO convert to Duration directly in Rule#remediationFunction -> better performance + error handling debt = debt.add(durations.decode(baseEffort)); } return debt; } return null; }
public void mergeExistingOpenIssue(DefaultIssue raw, DefaultIssue base) { Preconditions.checkArgument(raw.isFromExternalRuleEngine() != (raw.type() == null), "At this stage issue type should be set for and only for external issues"); raw.setKey(base.key()); raw.setNew(false);
.setAuthorLogin(issue.authorLogin()) .setRuleKey(issue.ruleKey().repository(), issue.ruleKey().rule()) .setExternal(issue.isFromExternalRuleEngine()) .setIsFromHotspot(issue.isFromHotspot()) .setTags(issue.tags())
.setRuleId(ruleId) .setRuleKey(issue.ruleKey().repository(), issue.ruleKey().rule()) .setExternal(issue.isFromExternalRuleEngine()) .setIsFromHotspot(issue.isFromHotspot()) .setTags(issue.tags())
private boolean canExecuteTransition(DefaultIssue issue, String transitionKey) { checkArgument(!issue.isFromExternalRuleEngine(), "No transition allowed on issue from externally define rule"); return transitionService.listTransitions(issue) .stream() .map(Transition::key) .collect(MoreCollectors.toSet()) .contains(transitionKey); }
@CheckForNull public Duration calculate(DefaultIssue issue) { if (issue.isFromExternalRuleEngine()) { return issue.effort(); } Rule rule = ruleRepository.getByKey(issue.ruleKey()); DebtRemediationFunction fn = rule.getRemediationFunction(); if (fn != null) { verifyEffortToFix(issue, fn); Duration debt = Duration.create(0); String gapMultiplier = fn.gapMultiplier(); if (fn.type().usesGapMultiplier() && !Strings.isNullOrEmpty(gapMultiplier)) { int effortToFixValue = MoreObjects.firstNonNull(issue.gap(), 1).intValue(); // TODO convert to Duration directly in Rule#remediationFunction -> better performance + error handling debt = durations.decode(gapMultiplier).multiply(effortToFixValue); } String baseEffort = fn.baseEffort(); if (fn.type().usesBaseEffort() && !Strings.isNullOrEmpty(baseEffort)) { // TODO convert to Duration directly in Rule#remediationFunction -> better performance + error handling debt = debt.add(durations.decode(baseEffort)); } return debt; } return null; }