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 c02a371..08b8105 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 @@ -158,7 +158,8 @@ protected static class LinkType { protected static Changes computeChanges(CreateConfig config) { final Changes.ChangesBuilder retVal = Changes.builder(); - for (CreateIssue raw : config.getIssues()) { + final Set disabledSummaries = config.getDisabledIssues().stream().map(CreateIssue::getSummary).collect(Collectors.toSet()); + for (CreateIssue raw : config.getEnabledIssues()) { // Integrate the configuration into the issue & record it final CreateIssue issue = raw.fallback(config); retVal.issue(issue); @@ -166,7 +167,7 @@ protected static Changes computeChanges(CreateConfig config) { // Record all the links for (String relationship : issue.getRelationships().keySet()) { for (String target : issue.getRelationships().get(relationship)) { - retVal.link(new LinkIssuesInput(issue.getSummary(), target, relationship, null)); + if (!disabledSummaries.contains(target)) retVal.link(new LinkIssuesInput(issue.getSummary(), target, relationship, null)); } } } @@ -201,8 +202,10 @@ public List createIssues(InputStream stream) throws JsonParseException, final CreateConfig config = load(stream); if ((config.getIssues() == null) || config.getIssues().isEmpty()) return Collections.emptyList(); + config.validateFlags(); final Changes changes = computeChanges(config); verifyChanges(changes); + //return changes.getIssues().stream().map(CreateIssue::getSummary).collect(Collectors.toList()); return implementChanges(changes); } 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 81d962f..15cff3e 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 @@ -3,10 +3,17 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.g2forge.alexandria.java.core.helpers.HCollection; +import com.g2forge.alexandria.java.core.helpers.HCollector; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.Getter; import lombok.Singular; @Data @@ -34,4 +41,31 @@ public class CreateConfig implements ICreateConfig { @Singular protected final Map> relationships; + + @Singular + protected final Map flags; + + @Getter(lazy = true) + @JsonIgnore + private final Map specifiedFlags = getFlags().entrySet().stream().filter(entry -> entry.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + @Getter(lazy = true) + @JsonIgnore + private final Set disabledFlags = getSpecifiedFlags().entrySet().stream().filter(entry -> !entry.getValue()).map(Map.Entry::getKey).collect(Collectors.toSet()); + + @JsonIgnore + public List getEnabledIssues() { + return getIssues().stream().filter(issue -> issue.isEnabled(this)).collect(Collectors.toList()); + } + + @JsonIgnore + public List getDisabledIssues() { + return getIssues().stream().filter(issue -> !issue.isEnabled(this)).collect(Collectors.toList()); + } + + public void validateFlags() { + final Set referencedFlags = getIssues().stream().flatMap(issue -> issue.getFlags() == null ? Stream.empty() : issue.getFlags().stream()).collect(Collectors.toSet()); + final Set unknownFlags = HCollection.difference(referencedFlags, getSpecifiedFlags().keySet()); + if (!unknownFlags.isEmpty()) throw new IllegalArgumentException("The following flags are refenced by issues, but are neither enabled nor disabled: " + unknownFlags.stream().collect(HCollector.joining(", ", ", & "))); + } } 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 94c0c40..fbcd5b6 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 @@ -3,10 +3,12 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.g2forge.alexandria.java.function.IFunction1; import lombok.AllArgsConstructor; @@ -41,6 +43,9 @@ public class CreateIssue implements ICreateConfig { @Singular protected final Map> relationships; + @Singular + protected final Set flags; + public CreateIssue fallback(CreateConfig config) { final CreateIssueBuilder retVal = builder(); @@ -48,7 +53,10 @@ public CreateIssue fallback(CreateConfig config) { retVal.project(IFunction1.create(ICreateConfig::getProject).applyWithFallback(this, config)); retVal.type(IFunction1.create(ICreateConfig::getType).applyWithFallback(this, config)); retVal.epic(IFunction1.create(ICreateConfig::getEpic).applyWithFallback(this, config)); - retVal.components(Stream.of(this, config).map(ICreateConfig::getComponents).flatMap(l -> l == null ? Stream.empty() : l.stream()).collect(Collectors.toSet())); + + // Only add the components from the config if it's the same project (or we have no project) + retVal.components(Stream.of(this, (getProject() == null) || getProject().equals(config.getProject()) ? config : null).filter(Objects::nonNull).map(ICreateConfig::getComponents).flatMap(l -> l == null ? Stream.empty() : l.stream()).collect(Collectors.toSet())); + retVal.labels(Stream.of(this, config).map(ICreateConfig::getLabels).flatMap(l -> l == null ? Stream.empty() : l.stream()).collect(Collectors.toSet())); retVal.securityLevel(IFunction1.create(ICreateConfig::getSecurityLevel).applyWithFallback(this, config)); retVal.assignee(IFunction1.create(ICreateConfig::getAssignee).applyWithFallback(this, config)); @@ -69,4 +77,9 @@ public CreateIssue fallback(CreateConfig config) { return retVal.build(); } + + @JsonIgnore + public boolean isEnabled(CreateConfig config) { + return (getFlags() == null) || !getFlags().stream().anyMatch(config.getDisabledFlags()::contains); + } }