From da5ee91aaf26b33bd4352ebe992829afa0ad145b Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Fri, 8 Jun 2018 14:32:40 +0200 Subject: Allow multiple issue labels --- .../api/integration/organization/Issue.java | 34 +++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Issue.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Issue.java index 37356f2c2a6..086487b8be7 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Issue.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Issue.java @@ -1,8 +1,12 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.api.integration.organization; +import com.google.common.collect.ImmutableList; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -16,46 +20,54 @@ public class Issue { private final String summary; private final String description; - private final String label; + private final List labels; private final User assignee; private final PropertyId propertyId; private final Type type; - private Issue(String summary, String description, String label, User assignee, PropertyId propertyId, Type type) { + private Issue(String summary, String description, List labels, User assignee, PropertyId propertyId, Type type) { if (summary.isEmpty()) throw new IllegalArgumentException("Issue summary can not be empty!"); if (description.isEmpty()) throw new IllegalArgumentException("Issue description can not be empty!"); Objects.requireNonNull(propertyId, "An issue must belong to a property!"); this.summary = summary; this.description = description; - this.label = label; + this.labels = ImmutableList.copyOf(labels); this.assignee = assignee; this.propertyId = propertyId; this.type = type; } public Issue(String summary, String description, PropertyId propertyId) { - this(summary, description, null, null, propertyId, Type.defect); + this(summary, description, Collections.emptyList(), null, propertyId, Type.defect); } public Issue append(String appendage) { - return new Issue(summary, description + appendage, label, assignee, propertyId, type); + return new Issue(summary, description + appendage, labels, assignee, propertyId, type); } public Issue with(String label) { - return new Issue(summary, description, label, assignee, propertyId, type); + List labels = new ArrayList<>(this.labels); + labels.add(label); + return new Issue(summary, description, labels, assignee, propertyId, type); + } + + public Issue with(List labels) { + List newLabels = new ArrayList<>(this.labels); + newLabels.addAll(labels); + return new Issue(summary, description, newLabels, assignee, propertyId, type); } public Issue with(User assignee) { - return new Issue(summary, description, label, assignee, propertyId, type); + return new Issue(summary, description, labels, assignee, propertyId, type); } public Issue with(PropertyId propertyId) { - return new Issue(summary, description, label, assignee, propertyId, type); + return new Issue(summary, description, labels, assignee, propertyId, type); } public Issue with(Type type) { - return new Issue(summary, description, label, assignee, propertyId, type); + return new Issue(summary, description, labels, assignee, propertyId, type); } public String summary() { @@ -66,8 +78,8 @@ public class Issue { return description; } - public Optional label() { - return Optional.ofNullable(label); + public List labels() { + return labels; } public Optional assignee() { -- cgit v1.2.3 From 607f4e032f0b2113a2efcf82b58c9c4407912774 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Fri, 8 Jun 2018 14:35:17 +0200 Subject: Allow issues in mock to be inspected --- .../integration/organization/MockOrganization.java | 40 +++++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/MockOrganization.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/MockOrganization.java index 5584f8a95fb..96ee9ecd052 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/MockOrganization.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/MockOrganization.java @@ -15,12 +15,15 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; +/** + * @author jvenstad + */ public class MockOrganization implements Organization { private final Clock clock; - private final AtomicLong counter; - private final HashMap issues; - private final HashMap properties; + private final AtomicLong counter = new AtomicLong(); + private final Map issues = new HashMap<>(); + private final Map properties = new HashMap<>(); @Inject @SuppressWarnings("unused") @@ -30,25 +33,21 @@ public class MockOrganization implements Organization { public MockOrganization(Clock clock) { this.clock = clock; - - counter = new AtomicLong(); - issues = new HashMap<>(); - properties = new HashMap<>(); } @Override public IssueId file(Issue issue) { IssueId issueId = IssueId.from("" + counter.incrementAndGet()); - issues.put(issueId, new WrappedIssue(issue)); + issues.put(issueId, new MockIssue(issue)); return issueId; } @Override public Optional findBySimilarity(Issue issue) { return issues.entrySet().stream() - .filter(entry -> entry.getValue().issue.summary().equals(issue.summary())) - .findFirst() - .map(Map.Entry::getKey); + .filter(entry -> entry.getValue().issue.summary().equals(issue.summary())) + .findFirst() + .map(Map.Entry::getKey); } @Override @@ -103,6 +102,10 @@ public class MockOrganization implements Organization { return URI.create("www.properties.tld/" + propertyId.id()); } + public Map issues() { + return Collections.unmodifiableMap(issues); + } + public void close(IssueId issueId) { issues.get(issueId).open = false; touch(issueId); @@ -125,21 +128,24 @@ public class MockOrganization implements Organization { } - private class WrappedIssue { + public class MockIssue { private Issue issue; private Instant updated; private boolean open; private User assignee; - private WrappedIssue(Issue issue) { + private MockIssue(Issue issue) { this.issue = issue; - - updated = clock.instant(); - open = true; - assignee = issue.assignee().orElse(properties.get(issue.propertyId()).defaultAssignee); + this.updated = clock.instant(); + this.open = true; + this.assignee = issue.assignee().orElse(properties.get(issue.propertyId()).defaultAssignee); } + public Issue issue() { return issue; } + public User assignee() { return assignee; } + public boolean isOpen() { return open; } + } -- cgit v1.2.3