summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/server/submit/ChangeSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/gerrit/server/submit/ChangeSet.java')
-rw-r--r--java/com/google/gerrit/server/submit/ChangeSet.java123
1 files changed, 123 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/submit/ChangeSet.java b/java/com/google/gerrit/server/submit/ChangeSet.java
new file mode 100644
index 0000000000..8c94a21534
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/ChangeSet.java
@@ -0,0 +1,123 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.submit;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * A set of changes grouped together to be submitted atomically.
+ *
+ * <p>MergeSuperSet constructs ChangeSets to accumulate intermediate results toward the ChangeSet it
+ * returns when done.
+ *
+ * <p>This class is not thread safe.
+ */
+public class ChangeSet {
+ private final ImmutableMap<Change.Id, ChangeData> changeData;
+
+ /**
+ * Additional changes not included in changeData because their connection to the original change
+ * is not visible to the current user. That is, this map includes both - changes that are not
+ * visible to the current user, and - changes whose only relationship to the set is via a change
+ * that is not visible to the current user
+ */
+ private final ImmutableMap<Change.Id, ChangeData> nonVisibleChanges;
+
+ private static ImmutableMap<Change.Id, ChangeData> index(
+ Iterable<ChangeData> changes, Collection<Change.Id> exclude) {
+ Map<Change.Id, ChangeData> ret = new LinkedHashMap<>();
+ for (ChangeData cd : changes) {
+ Change.Id id = cd.getId();
+ if (!ret.containsKey(id) && !exclude.contains(id)) {
+ ret.put(id, cd);
+ }
+ }
+ return ImmutableMap.copyOf(ret);
+ }
+
+ public ChangeSet(Iterable<ChangeData> changes, Iterable<ChangeData> hiddenChanges) {
+ changeData = index(changes, ImmutableList.<Change.Id>of());
+ nonVisibleChanges = index(hiddenChanges, changeData.keySet());
+ }
+
+ public ChangeSet(ChangeData change, boolean visible) {
+ this(
+ visible ? ImmutableList.of(change) : ImmutableList.<ChangeData>of(),
+ ImmutableList.of(change));
+ }
+
+ public ImmutableSet<Change.Id> ids() {
+ return changeData.keySet();
+ }
+
+ public ImmutableMap<Change.Id, ChangeData> changesById() {
+ return changeData;
+ }
+
+ public ListMultimap<Branch.NameKey, ChangeData> changesByBranch() throws OrmException {
+ ListMultimap<Branch.NameKey, ChangeData> ret =
+ MultimapBuilder.hashKeys().arrayListValues().build();
+ for (ChangeData cd : changeData.values()) {
+ ret.put(cd.change().getDest(), cd);
+ }
+ return ret;
+ }
+
+ public ImmutableCollection<ChangeData> changes() {
+ return changeData.values();
+ }
+
+ public ImmutableSet<Project.NameKey> projects() {
+ ImmutableSet.Builder<Project.NameKey> ret = ImmutableSet.builder();
+ for (ChangeData cd : changeData.values()) {
+ ret.add(cd.project());
+ }
+ return ret.build();
+ }
+
+ public ImmutableSet<Change.Id> nonVisibleIds() {
+ return nonVisibleChanges.keySet();
+ }
+
+ public ImmutableList<ChangeData> nonVisibleChanges() {
+ return nonVisibleChanges.values().asList();
+ }
+
+ public boolean furtherHiddenChanges() {
+ return !nonVisibleChanges.isEmpty();
+ }
+
+ public int size() {
+ return changeData.size() + nonVisibleChanges.size();
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ids() + nonVisibleIds();
+ }
+}