@Test public void test_simplest_transition() { Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .build(); assertThat(transition.key()).isEqualTo("close"); assertThat(transition.from()).isEqualTo("OPEN"); assertThat(transition.to()).isEqualTo("CLOSED"); assertThat(transition.conditions()).isEmpty(); assertThat(transition.functions()).isEmpty(); assertThat(transition.requiredProjectPermission()).isNull(); }
public boolean doManualTransition(DefaultIssue issue, String transitionKey, IssueChangeContext issueChangeContext) { Transition transition = stateOf(issue).transition(transitionKey); if (!transition.automatic()) { functionExecutor.execute(transition.functions(), issue, issueChangeContext); updater.setStatus(issue, transition.to(), issueChangeContext); return true; } return false; }
@CheckForNull public Transition outAutomaticTransition(Issue issue) { final Transition[] result = new Transition[1]; Set<String> keys = new HashSet<>(); Arrays.stream(outTransitions) .filter(Transition::automatic) .filter(transition -> transition.supports(issue)) .peek(transition -> result[0] = transition) .filter(transition -> !keys.add(transition.key())) .findAny() .ifPresent(transition -> { throw new IllegalArgumentException("Several automatic transitions are available for issue: " + issue); }); return result[0]; }
public Builder transition(Transition transition) { Preconditions.checkArgument(states.contains(transition.from()), "Originating state does not exist: " + transition.from()); Preconditions.checkArgument(states.contains(transition.to()), "Destination state does not exist: " + transition.to()); outTransitions.put(transition.from(), transition); return this; }
private static void checkDuplications(Transition[] transitions, String stateKey) { Set<String> keys = new HashSet<>(); Arrays.stream(transitions) .filter(transition -> !keys.add(transition.key())) .findAny() .ifPresent(transition -> { throw new IllegalArgumentException("Transition '" + transition.key() + "' is declared several times from the originating state '" + stateKey + "'"); }); }
public static Transition create(String key, String from, String to) { return builder(key).from(from).to(to).build(); }
public void checkTransitionPermission(String transitionKey, DefaultIssue defaultIssue) { String projectUuid = requireNonNull(defaultIssue.projectUuid()); workflow.outTransitions(defaultIssue) .stream() .filter(transition -> transition.key().equals(transitionKey) && isNotBlank(transition.requiredProjectPermission())) .forEach(transition -> userSession.checkComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)); }
public void doAutomaticTransition(DefaultIssue issue, IssueChangeContext issueChangeContext) { Transition transition = stateOf(issue).outAutomaticTransition(issue); if (transition != null) { functionExecutor.execute(transition.functions(), issue, issueChangeContext); updater.setStatus(issue, transition.to(), issueChangeContext); } }
@Test public void should_verify_conditions() { DefaultIssue issue = new DefaultIssue(); Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .conditions(condition1, condition2) .build(); when(condition1.matches(issue)).thenReturn(true); when(condition2.matches(issue)).thenReturn(false); assertThat(transition.supports(issue)).isFalse(); when(condition1.matches(issue)).thenReturn(true); when(condition2.matches(issue)).thenReturn(true); assertThat(transition.supports(issue)).isTrue(); }
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()); }
public Transition build() { checkArgument(!Strings.isNullOrEmpty(key), "Transition key must be set"); checkArgument(StringUtils.isAllLowerCase(key), "Transition key must be lower-case"); checkArgument(!Strings.isNullOrEmpty(from), "Originating status must be set"); checkArgument(!Strings.isNullOrEmpty(to), "Destination status must be set"); return new Transition(this); } }
Transition transition(String transitionKey) { return Arrays.stream(outTransitions) .filter(transition -> transitionKey.equals(transition.key())) .findAny() .orElseThrow(() -> new IllegalArgumentException("Transition from state " + key + " does not exist: " + transitionKey)); } }
@Test public void destination_status_should_be_set() { try { Transition.builder("close").from("OPEN").to("").build(); fail(); } catch (Exception e) { assertThat(e).hasMessage("Destination status must be set"); } }
public void checkTransitionPermission(String transitionKey, DefaultIssue defaultIssue) { String projectUuid = requireNonNull(defaultIssue.projectUuid()); workflow.outTransitions(defaultIssue) .stream() .filter(transition -> transition.key().equals(transitionKey) && isNotBlank(transition.requiredProjectPermission())) .forEach(transition -> userSession.checkComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)); }
public void doAutomaticTransition(DefaultIssue issue, IssueChangeContext issueChangeContext) { Transition transition = stateOf(issue).outAutomaticTransition(issue); if (transition != null) { functionExecutor.execute(transition.functions(), issue, issueChangeContext); updater.setStatus(issue, transition.to(), issueChangeContext); } }
public Builder transition(Transition transition) { Preconditions.checkArgument(states.contains(transition.from()), "Originating state does not exist: " + transition.from()); Preconditions.checkArgument(states.contains(transition.to()), "Destination state does not exist: " + transition.to()); outTransitions.put(transition.from(), transition); return this; }
public List<Transition> listTransitions(DefaultIssue issue) { 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()); }