Refactor: introduce Change class
This prepares a following commit that fixes the merge of non mergeable
crossrepos when processing RefUpdatedEvent.
Change-Id: Id608b41f8df9c751d12e04f53d32e4970c231a65
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
index 0d59513..5cadfbf 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
@@ -2,10 +2,8 @@
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
@@ -16,7 +14,6 @@
import com.google.gerrit.server.change.PostReview;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.git.MergeUtil;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
@@ -95,7 +92,7 @@
* @param change a ChangeAttribute instance
* @return true or false
*/
- public boolean isAtomicReview(final ChangeAttribute change) {
+ public boolean isAtomicReview(final Change change) {
final boolean atomic = change.topic != null && change.topic.startsWith(config.getTopicPrefix());
log.debug(String.format("Checking if change %s is an atomic change: %b", change.number, atomic));
return atomic;
@@ -110,7 +107,7 @@
* @throws OrmException
*/
public boolean isSubmittable(String project, int change) throws OrmException {
- ChangeData changeData = changeDataFactory.create(db.get(), new Project.NameKey(project), new Change.Id(change));
+ ChangeData changeData = changeDataFactory.create(db.get(), new Project.NameKey(project), new com.google.gerrit.reviewdb.client.Change.Id(change));
// For draft reviews, the patchSet must be set to avoid an NPE.
final List<SubmitRecord> cansubmit = new SubmitRuleEvaluator(changeData).setPatchSet(changeData.currentPatchSet()).evaluate();
log.debug(String.format("Checking if change %d is submitable.", change));
@@ -142,8 +139,8 @@
}
public RevisionResource getRevisionResource(String project, int changeNumber) throws NoSuchChangeException, OrmException {
- ChangeControl ctl = changeFactory.validateFor(db.get(), new Change.Id(changeNumber), getBotUser());
- ChangeData changeData = changeDataFactory.create(db.get(), new Project.NameKey(project), new Change.Id(changeNumber));
+ ChangeControl ctl = changeFactory.validateFor(db.get(), new com.google.gerrit.reviewdb.client.Change.Id(changeNumber), getBotUser());
+ ChangeData changeData = changeDataFactory.create(db.get(), new Project.NameKey(project), new com.google.gerrit.reviewdb.client.Change.Id(changeNumber));
RevisionResource r = new RevisionResource(collection.parse(ctl), changeData.currentPatchSet());
return r;
}
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
index 83e26dd..71097aa 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -106,7 +106,7 @@
private void onTopicChanged(final TopicChangedEvent event) {
- ChangeAttribute change = event.change.get();
+ Change change = Change.from(event.change.get());
if (!atomicityHelper.isAtomicReview(change)) {
return;
}
@@ -114,7 +114,7 @@
}
private void onPatchSetCreated(final PatchSetCreatedEvent event) {
- ChangeAttribute change = event.change.get();
+ Change change = Change.from(event.change.get());
if (atomicityHelper.isAtomicReview(change)) {
processNewAtomicPatchSet(change);
}
@@ -134,7 +134,7 @@
ChangeAttribute change = newComment.change.get();
try {
checkReviewExists(change.number);
- autoSubmitIfMergeable(change);
+ autoSubmitIfMergeable(Change.from(change));
} catch (RestApiException | OrmException | UpdateException | IOException e) {
log.error("An exception occured while trying to atomic merge a change.", e);
throw new RuntimeException(e);
@@ -177,7 +177,7 @@
}
}
- private void autoSubmitIfMergeable(ChangeAttribute change)
+ private void autoSubmitIfMergeable(Change change)
throws OrmException, RestApiException, NoSuchChangeException, IOException, UpdateException {
if (atomicityHelper.isSubmittable(change.project, change.number)) {
if (atomicityHelper.isAtomicReview(change)) {
@@ -216,7 +216,7 @@
return false;
}
- private void attemptToMergeAtomic(ChangeAttribute change)
+ private void attemptToMergeAtomic(Change change)
throws RestApiException, OrmException, NoSuchChangeException, IOException, UpdateException {
final List<ChangeInfo> related = Lists.newArrayList();
related.addAll(
@@ -247,7 +247,7 @@
}
}
- private void processNewAtomicPatchSet(ChangeAttribute change) {
+ private void processNewAtomicPatchSet(Change change) {
try {
checkReviewExists(change.number);
if (atomicityHelper.hasDependentReview(change.project, change.number)) {
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/Change.java b/src/main/java/com/criteo/gerrit/plugins/automerge/Change.java
new file mode 100644
index 0000000..a3e91e5
--- /dev/null
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/Change.java
@@ -0,0 +1,30 @@
+package com.criteo.gerrit.plugins.automerge;
+
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.server.data.ChangeAttribute;
+
+/**
+ * A change represented only with the fields that this plugin requires.
+ * <p>
+ * As a change can be a {@link ChangeAttribute} or a {@link ChangeInfo}, this intermediate class is
+ * needed.
+ */
+public class Change {
+ public final String project;
+ public final int number;
+ public final String topic;
+
+ private Change(String project, int number, String topic) {
+ this.project = project;
+ this.number = number;
+ this.topic = topic;
+ }
+
+ static public Change from(ChangeAttribute changeAttribute) {
+ return new Change(changeAttribute.project, changeAttribute.number, changeAttribute.topic);
+ }
+
+ static public Change from(ChangeInfo changeInfo) {
+ return new Change(changeInfo.project, changeInfo._number, changeInfo.topic);
+ }
+}