ChangeRebuilder Factor out event for status changes

Change-Id: Ib97b137c1eb6e4e120606d1589d151f56f92c713
This commit is contained in:
Dave Borowitz
2016-09-16 14:04:19 -04:00
parent 96586f59d8
commit 8db052af9f
3 changed files with 102 additions and 35 deletions

View File

@@ -31,11 +31,6 @@ class ChangeMessageEvent extends Event {
private static final Pattern TOPIC_REMOVED_REGEXP =
Pattern.compile("^Topic (.+) removed$");
private static final Pattern STATUS_ABANDONED_REGEXP =
Pattern.compile("^Abandoned(\n.*)*$");
private static final Pattern STATUS_RESTORED_REGEXP =
Pattern.compile("^Restored(\n.*)*$");
private final ChangeMessage message;
private final Change noteDbChange;
@@ -57,7 +52,6 @@ class ChangeMessageEvent extends Event {
checkUpdate(update);
update.setChangeMessage(message.getMessage());
setTopic(update);
setStatus(update);
}
private void setTopic(ChangeUpdate update) {
@@ -86,21 +80,4 @@ class ChangeMessageEvent extends Event {
noteDbChange.setTopic(null);
}
}
private void setStatus(ChangeUpdate update) {
String msg = message.getMessage();
if (msg == null) {
return;
}
if (STATUS_ABANDONED_REGEXP.matcher(msg).matches()) {
update.setStatus(Change.Status.ABANDONED);
noteDbChange.setStatus(Change.Status.ABANDONED);
return;
}
if (STATUS_RESTORED_REGEXP.matcher(msg).matches()) {
update.setStatus(Change.Status.NEW);
noteDbChange.setStatus(Change.Status.NEW);
}
}
}

View File

@@ -350,19 +350,17 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
Change noteDbChange = new Change(null, null, null, null, null);
for (ChangeMessage msg : bundle.getChangeMessages()) {
if (msg.getPatchSetId() == null) {
// No dependency necessary; will get assigned to most recent patch set
// in sortAndFillEvents.
events.add(
new ChangeMessageEvent(msg, noteDbChange, change.getCreatedOn()));
continue;
}
PatchSetEvent pse = patchSetEvents.get(msg.getPatchSetId());
if (pse != null) {
events.add(
new ChangeMessageEvent(msg, noteDbChange, change.getCreatedOn())
.addDep(pse));
List<Event> msgEvents = parseChangeMessage(
msg, noteDbChange, change.getCreatedOn());
if (msg.getPatchSetId() != null) {
PatchSetEvent pse = patchSetEvents.get(msg.getPatchSetId());
if (pse != null) {
for (Event e : msgEvents) {
e.addDep(pse);
}
}
}
events.addAll(msgEvents);
}
sortAndFillEvents(change, noteDbChange, events, minPsNum);
@@ -391,6 +389,18 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
}
}
private List<Event> parseChangeMessage(ChangeMessage msg, Change noteDbChange,
Timestamp changeCreatedOn) {
List<Event> events = new ArrayList<>(2);
events.add(new ChangeMessageEvent(msg, noteDbChange, changeCreatedOn));
Optional<StatusChangeEvent> sce =
StatusChangeEvent.parseFromMessage(msg, noteDbChange, changeCreatedOn);
if (sce.isPresent()) {
events.add(sce.get());
}
return events;
}
private static Integer getMinPatchSetNum(ChangeBundle bundle) {
Integer minPsNum = null;
for (PatchSet ps : bundle.getPatchSets()) {

View File

@@ -0,0 +1,80 @@
// Copyright (C) 2016 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.notedb.rebuild;
import com.google.common.base.Optional;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gwtorm.server.OrmException;
import java.sql.Timestamp;
import java.util.regex.Pattern;
class StatusChangeEvent extends Event {
private static final Pattern STATUS_ABANDONED_REGEXP =
Pattern.compile("^Abandoned(\n.*)*$");
private static final Pattern STATUS_RESTORED_REGEXP =
Pattern.compile("^Restored(\n.*)*$");
static Optional<StatusChangeEvent> parseFromMessage(ChangeMessage message,
Change noteDbChange, Timestamp changeCreatedOn) {
String msg = message.getMessage();
if (msg == null) {
return Optional.absent();
}
if (STATUS_ABANDONED_REGEXP.matcher(msg).matches()) {
return Optional.of(new StatusChangeEvent(
message, noteDbChange, changeCreatedOn, Change.Status.ABANDONED));
}
if (STATUS_RESTORED_REGEXP.matcher(msg).matches()) {
return Optional.of(new StatusChangeEvent(
message, noteDbChange, changeCreatedOn, Change.Status.NEW));
}
return Optional.absent();
}
private final Change noteDbChange;
private final Change.Status status;
private StatusChangeEvent(ChangeMessage message, Change noteDbChange,
Timestamp changeCreatedOn, Change.Status status) {
this(message.getPatchSetId(), message.getAuthor(),
message.getWrittenOn(), noteDbChange, changeCreatedOn, message.getTag(),
status);
}
private StatusChangeEvent(PatchSet.Id psId, Account.Id author,
Timestamp when, Change noteDbChange, Timestamp changeCreatedOn,
String tag, Change.Status status) {
super(psId, author, when, changeCreatedOn, tag);
this.noteDbChange = noteDbChange;
this.status = status;
}
@Override
boolean uniquePerUpdate() {
return true;
}
@Override
void apply(ChangeUpdate update) throws OrmException {
checkUpdate(update);
update.fixStatus(status);
noteDbChange.setStatus(status);
}
}