diff --git a/pj-create/src/main/java/com/g2forge/project/plan/create/Create.java b/pj-create/src/main/java/com/g2forge/project/plan/create/Create.java index 15608b5..ea7710b 100644 --- a/pj-create/src/main/java/com/g2forge/project/plan/create/Create.java +++ b/pj-create/src/main/java/com/g2forge/project/plan/create/Create.java @@ -15,18 +15,22 @@ import java.util.concurrent.ExecutionException; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.slf4j.event.Level; import com.atlassian.jira.rest.client.api.IssueRestClient; import com.atlassian.jira.rest.client.api.domain.BasicComponent; import com.atlassian.jira.rest.client.api.domain.BasicIssue; +import com.atlassian.jira.rest.client.api.domain.Issue; import com.atlassian.jira.rest.client.api.domain.IssueFieldId; import com.atlassian.jira.rest.client.api.domain.IssuelinksType; +import com.atlassian.jira.rest.client.api.domain.Transition; import com.atlassian.jira.rest.client.api.domain.input.ComplexIssueInputFieldValue; import com.atlassian.jira.rest.client.api.domain.input.FieldInput; import com.atlassian.jira.rest.client.api.domain.input.IssueInputBuilder; import com.atlassian.jira.rest.client.api.domain.input.LinkIssuesInput; +import com.atlassian.jira.rest.client.api.domain.input.TransitionInput; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -43,6 +47,7 @@ import com.g2forge.gearbox.jira.JIRAServer; import com.g2forge.project.plan.create.CreateIssue.CreateIssueBuilder; import com.g2forge.project.plan.create.field.KnownField; +import com.google.common.base.Objects; import io.atlassian.util.concurrent.Promise; import lombok.AllArgsConstructor; @@ -288,22 +293,39 @@ protected List implementChanges(Server server, Changes changes) throws I } if ((issue.getLabels() != null) && !issue.getLabels().isEmpty()) builder.setFieldInput(new FieldInput(IssueFieldId.LABELS_FIELD, issue.getLabels())); - final List throwables = new ArrayList<>(); - for (int i = 0; i < 5; i++) { - final Promise promise = issueClient.createIssue(builder.build()); - final BasicIssue created; - try { - created = promise.get(); - } catch (ExecutionException e) { - throwables.add(e); - continue; + BasicIssue created = null; + { + final List throwables = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + final Promise promise = issueClient.createIssue(builder.build()); + try { + created = promise.get(); + } catch (ExecutionException e) { + throwables.add(e); + continue; + } + issues.put(issue.getSummary(), created.getKey()); + throwables.clear(); + break; } - issues.put(issue.getSummary(), created.getKey()); - throwables.clear(); - break; + if (!throwables.isEmpty()) HError.withSuppressed(new RuntimeException(String.format("Failed to create issue: %1$s", issue.getSummary())), throwables).printStackTrace(System.err); } - if (!throwables.isEmpty()) { - HError.withSuppressed(new RuntimeException(String.format("Failed to create issue: %1$s", issue.getSummary())), throwables).printStackTrace(System.err); + + final String transitionName = issue.getTransition(); + if (transitionName != null) { + final List throwables = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + try { + final Issue actualIssue = issueClient.getIssue(created.getKey()).get(); + final Iterable transitions = issueClient.getTransitions(actualIssue).get(); + final Transition transition = StreamSupport.stream(transitions.spliterator(), false).filter(t -> Objects.equal(t.getName(), transitionName)).findFirst().orElse(null); + issueClient.transition(actualIssue, new TransitionInput(transition.getId())).get(); + } catch (ExecutionException e) { + throwables.add(e); + continue; + } + } + if (!throwables.isEmpty()) HError.withSuppressed(new RuntimeException(String.format("Failed to transition issue: %1$s %2$s", created.getKey(), issue.getSummary())), throwables).printStackTrace(System.err); } } diff --git a/pj-create/src/main/java/com/g2forge/project/plan/create/CreateConfig.java b/pj-create/src/main/java/com/g2forge/project/plan/create/CreateConfig.java index ed2c39a..6a4a726 100644 --- a/pj-create/src/main/java/com/g2forge/project/plan/create/CreateConfig.java +++ b/pj-create/src/main/java/com/g2forge/project/plan/create/CreateConfig.java @@ -23,8 +23,6 @@ @AllArgsConstructor @Jacksonized public class CreateConfig implements ICreateConfig { - - protected final String project; protected final String type; @@ -51,6 +49,8 @@ public class CreateConfig implements ICreateConfig { @Singular protected final Map flags; + + protected final String transition; @Getter(lazy = true) @JsonIgnore diff --git a/pj-create/src/main/java/com/g2forge/project/plan/create/CreateIssue.java b/pj-create/src/main/java/com/g2forge/project/plan/create/CreateIssue.java index eafe286..567ed37 100644 --- a/pj-create/src/main/java/com/g2forge/project/plan/create/CreateIssue.java +++ b/pj-create/src/main/java/com/g2forge/project/plan/create/CreateIssue.java @@ -48,6 +48,8 @@ public class CreateIssue implements ICreateConfig { @Singular protected final Set flags; + protected final String transition; + public CreateIssue fallback(ICreateConfig config) { final CreateIssueBuilder retVal = builder(); @@ -77,6 +79,7 @@ public CreateIssue fallback(ICreateConfig config) { retVal.summary(getSummary()); retVal.description(getDescription()); if (getRelationships() != null) retVal.relationships(getRelationships()); + retVal.transition(IFunction1.create(ICreateConfig::getTransition).applyWithFallback(this, config)); return retVal.build(); } diff --git a/pj-create/src/main/java/com/g2forge/project/plan/create/ICreateConfig.java b/pj-create/src/main/java/com/g2forge/project/plan/create/ICreateConfig.java index 1f56e3b..3b0430a 100644 --- a/pj-create/src/main/java/com/g2forge/project/plan/create/ICreateConfig.java +++ b/pj-create/src/main/java/com/g2forge/project/plan/create/ICreateConfig.java @@ -21,4 +21,6 @@ public interface ICreateConfig { public Set getLabels(); public Map> getRelationships(); + + public String getTransition(); }